按文件夹名称重命名文件

按文件夹名称重命名文件

我有一种文件夹(A、B、C、D、E、F、G、H),每个文件夹中有一个文件在所有文件夹(file.txt)中具有相同的名称,但该文件的大小文件夹与文件夹之间有所不同。我想将此文件从每个文件夹复制到一个新文件夹(X)中,并为该文件指定与原始文件夹相同的名称。我使用这个 bach 脚本来复制文件:

#!/bin/bash      
insub_FIM_M_1=path to a parent folder conatin all the folders (A,B,C,D,E,F,G,H) 

for i in $(cat $insub_FIM_M_1/FIM_1.txt); do
cp  insub_FIM_M_1/${i} <path to the new folder X >
done

在此代码中,所有文件都将覆盖新文件夹 (X) 中,因为它们在文件夹内具有相同的名称。如何修改此代码以将文件夹名称添加到文件名中,以便我可以知道文件的来源。

答案1

在目录是父目录的特殊情况下,您可以使用父目录中的 rename/prename[1] 将文件移动到该父目录:

rename -n 's:/:-:g' */file.txt

-n用于试运行,将其删除或替换-v为实际执行)

如果.txt文件有几层深(或深度未知),您可以使用 globstar 选项:

shopt -s globstar  # makes '**' match any levels of directories
rename -n 's:/:-:g' **/*.txt

[1] 该命令适用rename于 Debian/Ubuntu 及其衍生产品,以及prenameRedhat/Fedora 及其衍生产品

答案2

假设您的子目录位于$insub_FIM_M_1并且您要复制的文件file.txt在每个子目录中被调用,那么

mkdir -p result || exit 1
for pathname in "$insub_FIM_M_1"/*/file.txt; do
    cp "$pathname" "result/$( basename "$( dirname "$pathname" )" )_file.txt"
done

会将这些文件复制到result当前目录中的目录,同时根据它们所在的目录重命名每个文件。

答案3

我不完全确定你为什么要使用cat FIM_1.txt这个文件,因为你没有告诉我们这个文件。此代码将从一组文件夹中的每一个文件夹中进行复制,并将其放置在以其来源文件夹命名的file.txt目录中。X

cd "$insub_FIM_M_1"
for DIR in *
do
    test -d "$DIR" -a -f "$DIR/file.txt" || continue
    mv -f "$DIR/file.txt" "/path/to/X/$DIR"
done

答案4

我尝试了以下代码并且它有效:

 #!/bin/bash   
insub_FIM_M_1=path to a parent folder conatin all the folders (A,B,C,D,E,F,G,H) 
out=path 
for i in $(cat $insub_FIM_M_1/FIM_1.txt); do
cp  insub_FIM_M_1/file.txt ${path}/${i}.txt
done

相关内容