繁体   English   中英

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

[英]How to obtain new filename from old filename in the shell script?

我有一个具有输入和输出赞的可执行程序

./my_exe -i filename_input -o filename_output 

我想使用该程序运行结构类似的文件夹中的所有文件名

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

因此,我们可以使用它来做。 但是问题是我想通过在像abc.txt这样的输入文件名之前在'.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丢失了

$ 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

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

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时,需要使用find ... | xargs
确保您的*processed.txt不再被转换!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM