実際に、Xファイルをあるディレクトリから別のディレクトリに一度に移動する方法を知っている人はいますか?このページのすべての「はい」にエラーが表示され、役に立ちません。一度に 50 個のファイルしか移動できず、しばらくは「スリープ」状態になることがあります。ファイル名は異なりますが、拡張子は同じです。私が言ったように、すべての "ls"の例はRedhatでエラーを生成します。
答え1
特定の数のファイルを一度に移動し、移動の間に5秒間休止状態を維持するには、ソースディレクトリの次のような行を使用できます。
while true; do mv -v $(ls -1 *yyy | head -n 5) otherdir/ ; sleep 5; done
これはyyy
通常使用されるファイル拡張子と同じです。-n 5
これは、一度に5つのファイルを移動することを意味し、otherdir
ターゲットディレクトリです。要件に合わせてループを調整する必要があります。ここにリストされているように、すべてのソースファイルが移動されるとエラーが発生します。
答え2
拡張ディレクトリとターゲットディレクトリを許可するように調整できる小さなスクリプトは、アクションを実行します。
#!/bin/bash
files=$(find . -maxdepth 1 -type f -name "*.txt" | head -n50)
while [[ ! -z $files ]]; do
for f in $files; do
mv $f ../t2
done
files=$(find . -maxdepth 1 -type f -name "*.txt" | head -n50)
done
1,067個のファイルを作成したディレクトリに対してテストした結果、ファイルが移動されました。
このスクリプトを最適化する方法があると確信しています。
編集する:
コメントで指摘したように、上記のスクリプトはスペースを考慮しません。空白(ただし、すべての特殊文字ではない可能性があり、特にファイル名のキャリッジリターン)を記述する方法は次のとおりです。
#!/bin/bash
function move50() {
local NUM=0
find . -name "*.txt" | head -n50 | (while read -r f; do
echo " $f"
mv "$f" ../t2
(( NUM++ ))
done
return $NUM)
}
cntr=1
while [[ $cntr -gt 0 ]]; do
move50
cntr=$?
done
このメソッドは、名前にスペースが含まれるファイルを処理します。