如何从Shell脚本中的旧文件名中获取新文件名?

时间:2019-08-30 23:19:02

标签: bash shell

我有一个可执行的程序,具有喜欢的输入和输出

./my_exe -i filename_input -o filename_output 

我想使用该程序运行具有“喜欢”结构的文件夹中的所有文件名

root
|-folder_A
   |-abc.txt
|-folder_B
   |cdf.txt

因此,我们可以使用来做。但是问题是我想通过在'.txt'之类的abc.txt作为输入文件名之前添加扩展名'_processed'来自动从filename_input产生filename_output 。然后输出将是abc_processed.txt

如何在Shell脚本中执行此操作?这是我目前的代码

for sub_folder in "${root_folder[@]}"
        do            
            filename_input=$sub_folder/*.txt
            filename_output= filename_input/*.txt/processed.txt
            echo filename_output
        done

我的脚本的输出为root/folder_A/*processed.txt。我不知道为什么abc丢失了

2 个答案:

答案 0 :(得分:1)

$ tree root
root
|-- directory-A
|   `-- abc.txt
`-- directory-B
    `-- def.txt

2 directories, 2 files
$ find root -type f -exec sh -c 'echo ${1%.txt}_processed.txt' _ {} \;
root/directory-B/def_processed.txt
root/directory-A/abc_processed.txt

或:

$ for dir in root/*; do ( cd $dir; for file in *.txt; 
    do echo "$file --> ${file%.txt}_processed.txt"; done ) done
abc.txt --> abc_processed.txt
def.txt --> def_processed.txt

答案 1 :(得分:1)

正确的解决方案取决于您要使用的解决方案。
您应该遍历要重命名的文件,而不是目录。

for f in */*/*txt; do
   echo "With path ${f} ==> ${f//.txt/processed.txt}"
   base_f=${f##*/}
   echo "Basenames: ${base_f} ==> ${base_f//.txt/processed.txt}"
done

当您要使用这些文件调用find ... | xargs时,可能需要为此使用my_exe
确保您的*processed.txt不再被转换!