shell 脚本:遍历目录并移动/重命名文件

shell 脚本:遍历目录并移动/重命名文件

(仅供参考,我的 shell 脚本知识很少)

我有大量的文件和目录,看起来像

-root
 -dir1/a.txt
 -dir2/a.txt
 -dir3/b.txt
 -dir4/b.txt
 -dir5/c.txt

我希望能够将所有具有相同文件名的文件合并/连接在一起,然后将所有内容放在根目录中。因此最终结果将如下所示

-root/a.txt (combined from dir1 and dir2)
-root/b.txt (combined from dir3 and dir4)
-root/c.txt

如果这不可能,我甚至会将所有文件移至根目录,然后进行批量重命名。因此,

-root/a.txt.1
-root/a.txt.2
-root/b.txt.1
-root/b.txt.2
-root/c.txt.1

希望这是有意义的,并提前感谢:)

答案1

如果想要合并它们并且事先知道文件名,那么您可以尝试以下操作:

for i in a b c d
do
find <root direcoty> -iname "$i.txt" -exec cat {} \; > <root directory>/$i.txt
done

对于每个 a、b、c 和 d,我们在所有目录中查找名为 a.txt(b.txt ... d.txt)的文件,然后在文件名上调用 cat,并将输出通过管道传输到根目录下同名的一个文件中。

如果事先不知道的话,就会有点棘手,但这里:

for i in `find <root directory> -type f | sed -E 's!\./.*/([a-zA-Z0-9]+)\.txt!\1!g'`
do
find <root directory> -iname "$i.txt" -exec cat {} \; > <root directory>/$i.txt
done

它与之前的命令相同,只是我们获取列表的位置不同。我们首先获取根目录中所有文件的列表,然后删除文件名的所有部分,只包含文件名(没有目录和扩展名)。您应该注意,这仅适用于名称中混合有大小写字母和数字的文件,没有破折号或下划线。如果您想要它们,请更改[a-zA-Z0-9][a-zA-Z0-9-_]

将任何实例更改<root directory>为所需路径。

相关内容