我需要选择名称中包含“错误”或“流量”的文件,例如
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
运行以下命令,并替换{}
与给定的 find 参数匹配的文件。
如果您想使用 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