我有一个目录结构
DIR
SUBDIR1
11-01-11.txt
13-05-23.txt
SUBDIR2
12-05-56.txt
13-04-02.txt
15-04-06.txt
我想写一个 bash 脚本来实现这个所需输出
DIR
SUBDIR1
sub_dir1_merged.txt
SUBDIR2
sub_dir2_merged.txt
我想保留原始目录结构,将每个文件合并到一个 sub_dirname_merged.txt 文件中,并删除所有原始文件。
我尝试了以下方法代码
for f in */
do
cat $f/*.txt > "$f"/$f_merged.txt
rm $f/*.txt
done
这并不能完全发挥作用。
答案1
剧本:
for f in */*.txt; do
cat "$f" >> "$(dirname "$f")/$(dirname "$f")_merged.txt"
rm "$f"
done
在子目录中循环 txt 文件:
for f in */*.txt; do
$(dirname "$f")
返回 txt 所在文件夹的名称,该名称既用于命名文件又用于保存文件的路径。
rm "$f"
删除该文件。当您要使用rm
命令时,请确保脚本的结果是您所期望的,然后再执行它。
答案2
您可以与标志find
结合使用。-execdir
它变得简单如下:
find DIR/ -type f -execdir bash -c 'cat -- $1 >> "${PWD##*/}_merged.txt"' _ {} \;
我稍微修改了上面的一行代码,因此原始文件被删除。
find DIR/ -type f -execdir bash -c 'for f; do cat -- $f >> "${PWD##*/}_merged.txt"; done; [[ $f != *${PWD##*/}* ]] && rm -v "$f"' _ {} \;