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

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

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

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

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

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

ターミナルの使用に困っていないので、ファイル マネージャーを使用してクリックしてドラッグしました。それでも疑問は残ります。

答え1

必ずしも21個のファイルだけを手動で移動する必要があるわけではないとおっしゃったので、それを効率的に行うには、ブレース拡張:

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

答え2

これにより、説明したとおりにファイルが移動されます (ただし、2 番目の 21 個のファイルの場合、2 番目の範囲は 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

答え3

私が言いたいのは、たくさんのファイル(1万や100万など)を移動する場合に、{1..20}だけを使用すると、シェルはファイルリストが長すぎると文句を言うということです。

翻訳、ロードすることができます動画組み込み:

setopt 拡張グロブ 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

関連情報