我有一个名为“墨西哥”的文件夹,里面有 .jpg 格式的图片。如何将文件夹名称复制到文件名中。
这是当前的:
Mexico(folder)
1.jpg
2.jpg
这就是我想要的:
Mexico(folder)
Mexico1.jpg
Mexico2.jpg
然后剪下图片文件并将它们发送到另一个名为“图片”的文件夹中,那里有我其他的图片。然后删除原始的墨西哥文件夹。这两个文件夹没有关系。假设它们都在桌面上,彼此独立。
最终结果:
Pictures
-Mexico1.jpg
-Mexico2.jpg
-other.jpg
-... .jpg
在网上找不到好的答案。我比较喜欢简单的解决方案,我是新手。而且它应该是自动化的,这样就可以连续用于多个文件夹。所有文件夹都有不同的名称,例如“墨西哥”、“西班牙”...文件夹和图片太多,无法手动更改名称。
提前致谢
答案1
如果两个目录都位于同一个父目录中,Desktop
例如,您可以使用以下命令:
cd ~/Desktop
rename -n 's,^(.*)/,Pictures/$1-,' Mexico/*.jpg Spain/*.jpg
请注意,这实际上不会执行任何移动或重命名操作,它只会向您显示将要执行的操作。在-n
验证输出中的所有内容都正常后,运行命令以执行实际重命名。
然后你可以使用以下命令删除这些空目录:
rmdir Mexico Spain
甚至只是:
rmdir */
这将无法删除非空目录,但可以删除空目录。
答案2
在 Bash shell 循环中mv
:
for f in */*; do
if [ "${f%/*}" != "Pictures" ]; then
echo mv -nv -- "$f" "Pictures/${f%/*}${f#*/}"
fi
done
然后您需要cd ~/Desktop
运行循环并最后使用rmdir */
...删除空目录,或者一次完成所有操作:
{
cd ~/Desktop
for f in */*; do
if [ "${f%/*}" != "Pictures" ]; then
echo mv -nv -- "$f" "Pictures/${f%/*}${f#*/}"
fi
done
rmdir */
}
注意这echo
是为试运行而添加的,因此当对输出满意时将其删除,以进行实际重命名。
示范:
$ tree ~/Desktop
/home/ubuntu/Desktop
├── Mexico
│ ├── 1.jpg
│ └── 2.jpg
├── Pictures
│ ├── 1.jpg
│ └── 2.jpg
└── Spain
├── 1.jpg
└── 2.jpg
$
$
$ {
cd ~/Desktop
for f in */*; do
if [ "${f%/*}" != "Pictures" ]; then
mv -nv -- "$f" "Pictures/${f%/*}${f#*/}"
fi
done
rmdir */
}
renamed 'Mexico/1.jpg' -> 'Pictures/Mexico1.jpg'
renamed 'Mexico/2.jpg' -> 'Pictures/Mexico2.jpg'
renamed 'Spain/1.jpg' -> 'Pictures/Spain1.jpg'
renamed 'Spain/2.jpg' -> 'Pictures/Spain2.jpg'
rmdir: failed to remove 'Pictures/': Directory not empty
$
$
$ tree ~/Desktop
/home/ubuntu/Desktop
└── Pictures
├── 1.jpg
├── 2.jpg
├── Mexico1.jpg
├── Mexico2.jpg
├── Spain1.jpg
└── Spain2.jpg
注意.
除非您明确设置 Bash 的dotglob
选项,否则这将不适用于以点开头的隐藏文件/目录。
答案3
下面的脚本应该可以工作。
for file in $(find "./$1" -type f);
do
cp $file "./Pictures/$1$(basename $file)"
done
它遍历 $1(参数 1)目录中的文件,然后副本将其复制到带有 $1 前缀的 Pictures 目录中。它复制而不是移动,以使错误可逆。参数 1 是姓名,不是路径,是照片目录和前缀。
按照编辑@Dan 建议使用引号,如果您更多地参与脚本,您可能需要记住这一点。