使用 sed 重命名多个目录中的文件?

使用 sed 重命名多个目录中的文件?

我在不同的目录中有许多文件,例如

\images\00101191   
\images\Books

ETC。

我想重命名这些。我已将它们的路径导出到 CSV 文件,其中包含“旧路径和名称”、“新路径和新名称”格式的信息,例如

\00101191\XYZ123.jpg,\Homeware\TravelMugXYZ123.jpg

我已经尝试过命令

sed 's/"//g' files.csv | while IFS=, read orig new; do mv "$orig" "$new"; done

按照这个帖子但它删除了斜线,所以我只得到以下形式的错误

mv: cannot stat '00101191XYZ123.jpg': No such file or directory

我以为解决方案很简单,但我无法让语法发挥作用。任何帮助都将不胜感激。谢谢。

编辑-来自 csv 的实际行:

/00101234/1101.jpg,/Jewellery/ALittleThankYouTeacher1101.jpg
/00101234/1102.jpg,/Jewellery/ALittleThinkingOfYou1102.jpg
/00101234/1155.jpg,/Jewellery/ALittleDreamcatcher1155.jpg
/00101234/1203.jpg,/Jewellery/ALittleLuckyElephant1203.jpg

编辑2

ls -ld /00101234 /Jewellery
ls: cannot access '/00101234': No such file or directory
ls: cannot access '/Jewellery': No such file or directory

编辑3

今天我才知道我所知道的是多么的少。感谢您一直以来的帮助——我有以下输出,希望对您有所帮助?

user@Laptop:~/Desktop/images$ ls -ld /00101234 /Jewellery
ls: cannot access '/00101234': No such file or directory
ls: cannot access '/Jewellery': No such file or directory
user@Laptop:~/Desktop/images$ cd 00101234
user@Laptop:~/Desktop/images/00101234$ cd ..
user@Laptop:~/Desktop/images$ cd Jewellery
user@Laptop:~/Desktop/images/Jewellery$ cd ..
user@Laptop:~/Desktop/images$ ls -ld \00101234 \Jewellery
drwxrwxr-x 2 user user 32768 Jan  8 16:56 00101234
drwxrwxr-x 3 user user 20480 Jan  8 16:25 Jewellery

编辑4

我觉得我肯定遗漏了一些东西 - 但利用来自@wjandrea / @dessert 和@terdon 的信息,我想我已经找到了一些线索。

我使用的命令是

while IFS=, read -r orig new; do "/home/me/Images$orig" "/home/me/Images/NEW$new"; done < files.csv

我应该补充一点,我已将要重命名的文件文件夹复制到 /home/me/Images,并将 csv 文件也放在那里。我添加了 /NEW,这样我就可以轻松找到重命名的文件,因为我突然想到 CSV 中指定的某些文件夹已经存在并且包含文件。

我现在遇到的问题是,我收到权限被拒绝的错误,例如

bash: /home/me/Images/Xmas/XmasCushion.jpg: Permission denied

但就我(非常有限的)知识而言,我确实有权限

me@laptop:~$ ls -l /home/me/Images/Xmas/
total 176
-rw-rw-rw- 1 me me 94208 Mar  5  2018 Thumbs.db
-rw-rw-rw- 1 me me 48274 Sep 13 14:34 XmasCushion.jpg
-rw-rw-rw- 1 me me 31553 Sep 13 14:34 XmasBunting.jpg

如果存在权限问题,我唯一知道该做的事情就是使用 sudo 来执行,但随后我收到了错误

bash: syntax error near unexpected token `do'

通过你们的帮助我学到了一些东西 - 谢谢大家。抱歉,它仍然无法正常工作。

答案1

这里有几个问题。首先,您的文件不在 中/00101234//它是根目录,有点像 Windows 的C:。您的文件位于 中,~/Desktop/images/00101234/这意味着/home/yourUserName/Desktop/images/yourUserName您的用户名在哪里)。因此,处理这个问题最简单的方法是使用相对路径。例如,考虑这个文件:

/dir1/dir2/file

这是 的绝对路径file。但如果您在dir1目录中,则可以使用以下路径相对的到您的当前位置:dir2/file

考虑到这一点,让我们再看一下您的 csv 文件:

/00101234/1101.jpg,/Jewellery/ALittleThankYouTeacher1101.jpg

这些是相对路径。你可以用两种方法处理这个问题:

  1. 移入~/Desktop/images目录并按原样使用路径。
  2. 将它们转换为绝对路径。

我将重点介绍 2,因为它不太可能出现故障。此命令实际上不会执行任何操作,但它会打印出要执行的操作列表(从包含 csv 文件的目录运行此命令并更改yourCsv.csv为文件的实际名称):

while IFS=, read -r old new; do
    echo mv "~/Desktop/images${old}" "~/Desktop/images/Jewlery${new}"
done < yourCsv.csv

在我的系统上,使用您提供的文件,将打印以下内容:

mv ~/Desktop/images/00101234/1101.jpg ~/Desktop/images/Jewlery/Jewellery/ALittleThankYouTeacher1101.jpg
mv ~/Desktop/images/00101234/1102.jpg ~/Desktop/images/Jewlery/Jewellery/ALittleThinkingOfYou1102.jpg
mv ~/Desktop/images/00101234/1155.jpg ~/Desktop/images/Jewlery/Jewellery/ALittleDreamcatcher1155.jpg
mv ~/Desktop/images/00101234/1203.jpg ~/Desktop/images/Jewlery/Jewellery/ALittleLuckyElephant1203.jpg

如果这样可以打印出您想要的内容,那么我们就可以开始了。删除echo(这只意味着“打印这个”,因此删除它将导致循环执行命令,mv而不仅仅是打印它)。

然而,这很重要,您的 csv 可能有点不同。我假设您在 Windows 中创建了它,这意味着它将有所不同行尾。因此,为了安全起见,您需要运行以下命令:

tr -d '\r' < yourCsv.csv | while IFS=, read -r old new; do
    mv "~/Desktop/images${old}" "~/Desktop/images/Jewlery${new}"
done < yourCsv.csv

当然,我强烈建议您首先备份所有这些文件,以防出现问题。

答案2

这是一XY问题,目前问题X的解尚不清楚,但问题Y的解是:

为了防止read解释反斜杠,请使用选项-r. 来自help read

-r        do not allow backslashes to escape any characters

例子

设置:

$ echo '\00101191\XYZ123.jpg,\Homeware\TravelMugXYZ123.jpg' > files.csv

没有-r

$ while IFS=, read orig new; do echo "$orig" "$new"; done < files.csv
00101191XYZ123.jpg HomewareTravelMugXYZ123.jpg

-r

$ while IFS=, read -r orig new; do echo "$orig" "$new"; done < files.csv
\00101191\XYZ123.jpg \Homeware\TravelMugXYZ123.jpg

相关内容