特定の文字を含むファイルをgrepして別のフォルダに移動する必要があるLinux

特定の文字を含むファイルをgrepして別のフォルダに移動する必要があるLinux

名前に「エラー」または「トラフィック」を含むファイルを選択する必要があります。

abc_ERRor.csv
raError.csv
bsn_Error.csv
bbbctraffic.csv
ccc_traffic.csv
...

Error_directorytraffic_directory名前に従ってそのディレクトリに移動します。

試しましたが成功しませんでした。

mv $(ls test_file | grep -l 'Error>' *) Error_directory

コマンドラインでこれを行うにはどうすればよいですか?

ls test_file | grep 'Error'

答え1

lsファイル名に表示される文字がさまざまなため、出力を解析するのは良い考えではありません。より良い解決策は次のとおりです。

find ./test_file -iname "*error*" -print0 | xargs -0 -I {} mv {} Error_directory

-inameこのオプションに注意してください。これにより、大文字と小文字を区別しない一致が返され、ファイルを検索して移動できます。たとえば、次のようになります。

abc_ERRor.csv
error_123.csv
ErRoR_77.csv

大文字と小文字を区別せずに検索する必要がない場合は、次のように単純なもので十分です。

mv test_file/*Error* Error_directory

追加資料:

xargs 区切り記号の問題

バッシュトラップ

答え2

別の考えられる解決策は次のとおりです。

#!/bin/sh

err_dir=~/errors
tra_dir=~/traffic

for f in *.csv; do
    case $f in
        *[Ee][Rr][Rr][Oo][Rr]*) mv -i $f $err_dir ;;
        *[Tt][Rr][Aa][Ff][Ii][Cc]*) mv -i $f $tra_dir ;;
    esac
done

答え3

以下を使用して見つけることができます。

find test_file -type f -name "*Error*" -exec mv {} Error_directory/ \;

これは-type fファイルを探していることを意味し、与えられた-nameパターンと一致することを意味します。exec次のコマンドを実行し、指定された{}検索パラメーターと一致するファイルを置き換えます。

Bashを使用して試したものと同様の操作を実行するには、ループを使用します。

for f in `ls test_file | grep 'Error'; do
  mv test_file/${f} Error_directory
done

どちらの例でも、test_fileは興味のあるファイルを含むディレクトリであると仮定します。

答え4

for fn in *.*; do for word in Error traffic; do echo "$fn" | grep -i "$word" && mkdir -p "$word"_directory && mv "$fn" "$word"_directory; done; done

関連情報