Linux Redhatで指定された数のファイルをあるディレクトリから別のディレクトリに移動する[閉じる]

Linux Redhatで指定された数のファイルをあるディレクトリから別のディレクトリに移動する[閉じる]

実際に、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

このメソッドは、名前にスペースが含まれるファイルを処理します。

関連情報