Unix shell脚本用于查找文件并按模式替换名称

时间:2014-01-08 08:44:32

标签: shell unix

我有一个名为/input/temp的文件夹。在文件夹里面我有很多文件。我需要找到模式Article_????_test_?????????.txt的文件,并用下面的格式替换。

Article_????_?????????.txt

以下是我尝试的代码,但不起作用:

echo "Please provide the file name Corresponding to DC..."
read file 
ls $HOME/*.txt | grep $file
if [ $? -eq 0 ]
find . $file '*_Test_*' -exec bash -c 'mv $0 ${0/_Test/ }' {} \;

    if [ $? -eq 0 ]
find . $file -name "*.txt" -exec bash -c "mv {} \`echo {} | sed -e 's/[_TEST_]/_/g'\`" \;
then

我得到以下错误:

find: 0652-083 Cannot execute bash:: A file or directory in the path name does not exist.
find: 0652-083 Cannot execute bash:: A file or directory in the path name does not exist.

bash无法在我的平台上执行。

4 个答案:

答案 0 :(得分:1)

  • 除非文件名是正则表达式,否则您可以使用if [ -e "$file" ]代替ls + grep + test
  • 执行find . $file '*_Test_*'时,最后三个参数实际上被视为要在下面搜索的文件或目录!它会回来
    • 当前目录中的所有文件
    • 目录$file 中的所有文件或路径$file,如果它不是目录,
    • 任何目录中与*_Test_* 匹配的目录中的所有文件(如果它们不是目录)。
  • 不需要bash - 您可以直接在mv中运行-exec。这只是额外的复杂性,没有收获。
  • 使用$(command)代替command,以便更轻松地处理报价。每个command都有一个单独的引用上下文,因此您可以执行$()

答案 1 :(得分:0)

根据链接here: 这应该工作

ls -1 Article_????test?????????.txt|awk '{old=$0;gsub(/test/,"_",$0);system("mv \""old"\" "$0)}'

答案 2 :(得分:0)

同时尝试“重命名”命令。

rename 's/_test_/_/' *.txt

您可以微调正则表达式...

答案 3 :(得分:0)

从您的代码更新:

cd $HOME
find . -name '*_Test_*' |while read line
do
  echo mv ${line) ${line/_Test/}
done

如果你需要搜索模式文章_ ???? 测试 ?????????。txt,试试这个

cd $HOME
find . -name 'Article_????_test_?????????.txt' |while read line
do
  echo mv ${line) ${line/_Test/}
done