mvは、ファイル名をフィルタリングするためにgrepを使用するパイプのstdinについて文句を言います。

mvは、ファイル名をフィルタリングするためにgrepを使用するパイプのstdinについて文句を言います。

スペースを含む複数の.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

L, --files-without-match は
通常の出力を抑制します。代わりに、通常は印刷されない各入力ファイルの名前を印刷します。検索は最初の一致で停止します。

だからリストする代わりにファイル名一致しない項目のみがaviリストされます。場所どこにもgrep見つかりませんavigrep検索は通常ファイル内で行われるため、これらのスイッチはaviパターンを含まないファイル名をリストします。しかし、あなたの場合はgrepfromでパイプしているので、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"

おすすめ記事