当源文件名包含嵌入空格时,如何复制文件并动态重命名

当源文件名包含嵌入空格时,如何复制文件并动态重命名

我正在尝试将图像文件从一个目录复制并重命名到另一个目录。

我想要复制的文件的文件名中嵌入了空格,我想用拍摄图像的日期替换部分文件名。

下面是我一直在使用的文件名和命令的示例,以及我看到的错误消息的示例。

例如,我想从源目录复制“2008_08_17_Transfer 001.jpg”文件,并在目标目录中将其重命名为“20090314001.jpg”,依此类推,对于源目录中以“2008_08_17_Transfer”开头的每个文件。

以下是我尝试过的方法以及看到的错误消息:

$ ls -l
total 241968
-rw------- 1 stephen stephen  1347770 Mar 14  2009 2008_08_17_Transfer 001.jpg
-rw------- 1 stephen stephen  1077919 Mar 14  2009 2008_08_17_Transfer 002.jpg
-rw------- 1 stephen stephen  1359947 Mar 14  2009 2008_08_17_Transfer 003.jpg
-rw------- 1 stephen stephen  1309175 Mar 14  2009 2008_08_17_Transfer 004.jpg
-rw------- 1 stephen stephen  1404298 Mar 14  2009 2008_08_17_Transfer 005.jpg
...

for i in *.jpg ; do scp -p "$i" /media/stephen/WDMyBook1_ext4/PicturesRenamedByDateTaken/2009/20090314/20090314`echo "$i" ` ; done

001.jpg: No such file or directory
002.jpg: No such file or directory
003.jpg: No such file or directory

答案1

for i in *.jpg ; do 
  cp -p "$i" "/media/stephen/WDMyBook1_ext4/PicturesRenamedByDateTaken/2009/20090314/20090314${i##* }"
done

shell 参数扩展${i##* }会删除以空格结尾的最长前缀(即,直到00n.jpg数字后缀之前的空格在内的所有内容)。无需使用echo

我假设这是一个本地副本,因此您不需要scp

注意:如果你想派生20090314以目录名称的形式编程,这是可行的 - 但显然使事情变得有点复杂。

答案2

只需将文件名括起来,就像这样

for i in *.jpg ; do scp -p "$i" "/media/stephen/WDMyBook1_ext4/PicturesRenamedByDateTaken/2009/20090314/20090314`echo "$i" `" ; done

相关内容