
スペースが含まれている複数の .avi ファイルを CD からホーム フォルダに移動しようとしています。スペースを削除する方法は既にわかっています。
find /media/mathscd/ | grep -L -r "*.avi" | for file in *; do mv "$file" echo $file | tr ' ' '_' ; done
しかし、編集したファイルを見つけてフォルダーにまとめて移動させるのに苦労しています。エラーが繰り返し発生しますmv: cannot stat '(standard input)': No such file or directory
。使用しようとしているコードは次のとおりです。
find /media/mathscd/ | grep -L -r "*.avi" | xargs -I{} mv {} /home/09murphyt/Downloads/
誰か私が何を間違っているのか教えてもらえますか?
答え1
問題は-L
へのスイッチですgrep
。man ページから:
L, --files-without-match
通常の出力を抑制し、代わりに通常は出力が印刷されない各入力ファイルの名前を印刷します。スキャンは最初の一致で停止します。
だから、ファイル名一致しない場合avi
は、場所は を見つけられませんgrep
でしたavi
。 はgrep
通常ファイルを検索するので、このようなスイッチはパターンを含まないファイル名をリストしますavi
。 ただし、あなたの場合はgrep
から にパイプしているのでfind
、読み取っているファイルgrep
は です(standard input)
。 私の言っていることを理解するには、次を試してください。
find /media/mathscd | grep -L "*.avi"
結果:
(standard input)
つまり、標準入力でgrep
一致しない行が見つかりました"*.avi"
。これがまさに起こったことです。
ファイル名を直接リストするのでfind
、一致の意味を反転するだけで済みます。
find /media/mathscd | grep -v ".*\.avi"
(grep
パターンはシェルのワイルドカードとは異なることに注意してください。スイッチも必要ありません-r
)
また、find
単独で使用する場合:
find /media/mathscd ! -name "*.avi"
答え2
次のいずれかを試してください:
find /media/mathscd/ -name *.avi -exec mv -t ~/Downloads/ {} +
find /media/mathscd/ -name *.avi -print0 | xargs -0 mv -t ~/Downloads/
必ず最初xargs mv*
に に置き換えてテストしてくださいxargs ls
。