名前に「エラー」または「トラフィック」を含むファイルを選択する必要があります。
abc_ERRor.csv
raError.csv
bsn_Error.csv
bbbctraffic.csv
ccc_traffic.csv
...
Error_directory
traffic_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
追加資料:
答え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