我有一种文件夹(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 及其衍生产品,以及prename
Redhat/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