Использовать sed для переименования файлов в нескольких каталогах?

У меня есть много файлов в различных каталогах, например,

\images\00101191   
\images\Books

и т.д.

Я хотел бы переименовать их. Я экспортировал их пути к файлу 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 там также. Я добавил / НОВЫЙ, таким образом, я могу легко найти переименованные файлы, поскольку мне пришло в голову, что некоторые папки, указанные в 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
задан 9 January 2019 в 16:51

2 ответа

Здесь существует несколько проблем. В первую очередь, Ваши файлы не находятся в /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
ответ дан 7 December 2019 в 13:19

Это - 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
0
ответ дан 7 December 2019 в 13:19

Другие вопросы по тегам:

Похожие вопросы: