我在不同的目录中有许多文件,例如
\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
这些是相对路径。你可以用两种方法处理这个问题:
- 移入
~/Desktop/images
目录并按原样使用路径。 - 将它们转换为绝对路径。
我将重点介绍 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