web-dev-qa-db-ja.com

番号付きファイルの範囲を移動しますか?

別のディレクトリに移動する必要がある291の番号付きファイル(001-タイトルで始まり、291-タイトルで終わる)があります。 (001から021はフォルダー1、022から053はフォルダー2で、必ずしも毎回同じ数のファイルであるとは限りません)。

私はこのような厄介な方法でそれを行うことができると考えました:ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh

もっと良い方法があると私はほぼ確信していますので、それは何でしょうか?

編集:それでうまくいったでしょうが、私は思い出しました...

ターミナルを使用して立ち往生していないので、ファイルマネージャーを使用してクリックアンドドラッグしました。質問はまだ残っています。

14
Rob

手動でファイルを移動する必要があるのは、必ずしも正確に21ファイルであるとは限らないと言ったので、これを効果的に行うには、 brace expandedを使用できます。

mv filename{001..21} dir1
mv filename{022..53} dir2
...
25
drrlvn

これにより、説明したとおりにファイルが移動します(2番目の範囲が2番目の21個のファイルで022から042になる場合を除く)。

for ((i = 1; i <= 291; i++))
do
    ((d = (i - 1) / 21 + 1))
    printf -v file 'filename%03d' "$i"
    printf -v dir  'dirname%02d'  "$d"
    [[ -d "$d" ]] && mkdir "$d"
    mv "$f" "$d"
done

多くのファイル(1万または100万など)を移動するということですが、{1..20}を使用しただけでは、シェルはファイルリストについて不平を言うので、

zshでは、mvビルトインをロードできます:

setopt extended_glob zmodload

zsh /ファイル

その後、次のようなコマンドを使用できます。

mv ./somefolder/{1..100000}.txt  pathto/yourfolder/

または、シェルスクリプトを記述している場合は、次のようなことができます。

for i in `seq $start $end`;  
    do  mv "prefix${i}suffix.txt" pathto/yourfolder/  
done

zshを使用していない場合は、 https://unix.stackexchange.com/questions/128559/solving-mv-argument-list-too-long を参照してください。

0
Arron Cao