Bash - 将一些具有相同扩展名和不同名称的文件复制到多个名为文件的文件夹中
Bash - Copy some files with same extensions and different names to multiple folders called like the files
我想为 linux 编写一个脚本,将几个具有相同扩展名但不同名称的文件复制到另一个目录中,该目录与我要复制的文件具有相同的文件夹并且与文件具有相同的名称,并且这些文件,一个接一个,在它们的文件夹中。
例如,我有这个:
Directory X -
abcd.zip
cdab.zip
adcb.zip
...
我想要这样的副本:
Directory Y -
abcd -
abcd.zip
cdab -
cdba.zip
adcb -
adcb.zip
... -
...
不知道我解释的对不对,不好意思
提前致谢。
已解决。我用这个:
cd x
for file in *.zip; do
name="${file%.*}";
mkdir -p $name;
cp $file $name;
done
rm *.zip
cd ..
rsync x/* y
试试这样的东西:
for file in *.zip
do
destination=$(${filename%.*})##extract extension
mkdir -p "${destination}" ## make directory if not present
cp $file ${destination} ##copy the file
done
一个班轮:
for file in *.zip; do name="${file%.*}"; mkdir -p $name; cp $file $name/; done
应该这样做:
#!/bin/bash
directoryX=/pathtoX
directoryY=/pathtoY
for file in $directoryX/*; do
filename="${file##*/}"
dirname="${filename%%.*}"
cp "$file" "$directoryY"/"$dirname"/"$filename"
done
另一种使用find
的单行:
find X -name *.zip -exec sh -c "dir=Y/$( basename {} .zip ) ; mkdir ${dir} && cp {} ${dir}/" \;
之前:
.
├── X
│ ├── abcd.zip
│ ├── adcb.zip
│ └── cdab.zip
└── Y
之后:
.
├── X
│ ├── abcd.zip
│ ├── adcb.zip
│ └── cdab.zip
└── Y
├── abcd
│ └── abcd.zip
├── adcb
│ └── adcb.zip
└── cdab
└── cdab.zip
请注意,此方法使用标准工具,但未针对性能进行调整(它将为每个查找结果调用 4 个进程)。这只会是很多文件的问题(我的机器上每个额外的文件需要 4 毫秒)。
不过,在任何 shell 脚本解决方案中,您至少需要 2 个额外的进程(mkdir
和 cp
)。
我想为 linux 编写一个脚本,将几个具有相同扩展名但不同名称的文件复制到另一个目录中,该目录与我要复制的文件具有相同的文件夹并且与文件具有相同的名称,并且这些文件,一个接一个,在它们的文件夹中。
例如,我有这个:
Directory X -
abcd.zip
cdab.zip
adcb.zip
...
我想要这样的副本:
Directory Y -
abcd -
abcd.zip
cdab -
cdba.zip
adcb -
adcb.zip
... -
...
不知道我解释的对不对,不好意思
提前致谢。
已解决。我用这个:
cd x
for file in *.zip; do
name="${file%.*}";
mkdir -p $name;
cp $file $name;
done
rm *.zip
cd ..
rsync x/* y
试试这样的东西:
for file in *.zip
do
destination=$(${filename%.*})##extract extension
mkdir -p "${destination}" ## make directory if not present
cp $file ${destination} ##copy the file
done
一个班轮:
for file in *.zip; do name="${file%.*}"; mkdir -p $name; cp $file $name/; done
应该这样做:
#!/bin/bash
directoryX=/pathtoX
directoryY=/pathtoY
for file in $directoryX/*; do
filename="${file##*/}"
dirname="${filename%%.*}"
cp "$file" "$directoryY"/"$dirname"/"$filename"
done
另一种使用find
的单行:
find X -name *.zip -exec sh -c "dir=Y/$( basename {} .zip ) ; mkdir ${dir} && cp {} ${dir}/" \;
之前:
.
├── X
│ ├── abcd.zip
│ ├── adcb.zip
│ └── cdab.zip
└── Y
之后:
.
├── X
│ ├── abcd.zip
│ ├── adcb.zip
│ └── cdab.zip
└── Y
├── abcd
│ └── abcd.zip
├── adcb
│ └── adcb.zip
└── cdab
└── cdab.zip
请注意,此方法使用标准工具,但未针对性能进行调整(它将为每个查找结果调用 4 个进程)。这只会是很多文件的问题(我的机器上每个额外的文件需要 4 毫秒)。
不过,在任何 shell 脚本解决方案中,您至少需要 2 个额外的进程(mkdir
和 cp
)。