我有一个可执行的程序,具有喜欢的输入和输出
./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丢失了
答案 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
不再被转换!