需要 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分隔符问题

bash 陷阱

答案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

相关内容