mv は、ファイル名を grep でフィルタリングするパイプラインの標準入力についてエラーを出します。

mv は、ファイル名を grep でフィルタリングするパイプラインの標準入力についてエラーを出します。

スペースが含まれている複数の .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

関連情報