Удаление подчеркивания файлов в каталоге - PullRequest
1 голос
/ 04 февраля 2020

Я хочу удалить подчеркивания файлов, которые есть в некоторых каталогах

У меня есть это:

Divulgation
├── Biology
│   └── Dawkins, C. Richard
│       └── Books
│           ├── The_Blind_Watchmaker.pdf
│           ├── The_God_Delusion.pdf
│           └── The_Selfish_Gene_(3rd_Ed.).pdf
├── Chemistry
│   └── Gray, Theodore W
│       └── Books
│           ├── Molecules_The_Elements_and_the_Architecture_of Everything.epub
│           └── The_Elements,_A_Visual_Exploration_of_Every_Known_Atom in_the_Universe.pdf
└── Physics
    ├── Hawking, Stephen
    │   └── Books
    │       ├── A_Brief_History_of_Time_from_the_Big_Bang_to_Black Holes.djvu
    │       ├── My_Brief_History.epub
    │       └── The_Universe_in_a_Nutshell.pdf
    └── Sagan, Carl E
        └── Books
            ├── Billions_and_Billions_Thoughts_on_Life_and_Death_at_the Brink_of_the_Millennium.pdf
            ├── Cosmos.pdf
            └── The_Dragons_of_Eden.epub

Я хочу это: enter image description here

Моя попытка:

#!/bin/bash


shopt -s extglob  # allow fancy @(...) construct to specify dirs
shopt -s globstar # add double-asterisk for flexible depth

for f in @(Divulgation)/**/Books/*.pdf           # Search for Filed under Books Directory
do echo "mv "$f" `echo "$f" | sed 's/_/ /g'` "   # Show the command first
         mv "$f" `echo "$f" | sed 's/_/ /g'`     # Rename File by removing Underscores using the s Command
done

Ошибка:

mv Divulgation/Biology/Dawkins, C. Richard/Books/The_Blind_Watchmaker.pdf Divulgation/Biology/Dawkins, C. Richard/Books/The Blind Watchmaker.pdf 
mv: target 'Watchmaker.pdf' is not a directory
mv Divulgation/Biology/Dawkins, C. Richard/Books/The God Delusion.pdf Divulgation/Biology/Dawkins, C. Richard/Books/The God Delusion.pdf 
mv: target 'Delusion.pdf' is not a directory
mv Divulgation/Biology/Dawkins, C. Richard/Books/The Selfish Gene (3rd Ed.).pdf Divulgation/Biology/Dawkins, C. Richard/Books/The Selfish Gene (3rd Ed.).pdf 
mv: target 'Ed.).pdf' is not a directory
mv Divulgation/Chemistry/Gray, Theodore W/Books/The Elements, A Visual Exploration of Every Known Atom in the Universe.pdf Divulgation/Chemistry/Gray, Theodore W/Books/The Elements, A Visual Exploration of Every Known Atom in the Universe.pdf 
mv: target 'Universe.pdf' is not a directory
mv Divulgation/Physics/Hawking, Stephen/Books/The Universe in a Nutshell.pdf Divulgation/Physics/Hawking, Stephen/Books/The Universe in a Nutshell.pdf 
mv: target 'Nutshell.pdf' is not a directory
mv Divulgation/Physics/Sagan, Carl E/Books/Billions and Billions Thoughts on Life and Death at the Brink of the Millennium.pdf Divulgation/Physics/Sagan, Carl E/Books/Billions and Billions Thoughts on Life and Death at the Brink of the Millennium.pdf 
mv: target 'Millennium.pdf' is not a directory
mv Divulgation/Physics/Sagan, Carl E/Books/Cosmos.pdf Divulgation/Physics/Sagan, Carl E/Books/Cosmos.pdf 
mv: target 'E/Books/Cosmos.pdf' is not a directory

Помогите ... Ммм, PDF - это обзоры Книг, а не самих Книг ..

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Отличный сценарий, почти нет.

  • Использование обратных галочек `не рекомендуется. Не используйте их. Вместо этого используйте $(..).
  • Всегда запоминайте, чтобы заключать в кавычки расширения (и также обратные метки, если вы их используете).
  • Помните, что echo "$f" может не работать для странных имен файлов, таких как -e. Используйте printf "%s\n" "$f" вместо . Но так как это bash, вы можете просто <<<"$f" использовать здесь строку .
  • Вы можете использовать set -x, чтобы увидеть, что происходит. Я думаю, что простой mv -v может быть более ... простым.

Вам нужно заключить в кавычки. Если вы не заключите их в кавычки, shell сделает разбиение слов - разбить результат по пробелам на несколько аргументов. Так, например, ls $(echo "filename with spaces.txt") будет запускаться ls с 3 аргументами, а ls будет интерпретироваться как 3 отдельных файла - filename, with и spaces.txt.

и заменять галочки на $(...):

for f in Divulgation/**/Books/*.pdf; do
     mv -v "$f" "$(<<<"$f" sed 's/_/ /g')"
done

Для замены одиночных символов для меня использование tr '_' ' ' кажется более «подходящей» командой, чем sed.

0 голосов
/ 04 февраля 2020

Это может работать для вас (поиск, переименование и GNU параллельно):

find Divulgation -path '*/Books/*.pdf' | rename -v 's/_/ /g'

Если вы хотите параметризовать верхний каталог, используйте:

parallel --dry find {} -path '*/Books/*.pdf' \| rename -v 's/_/ /g' ::: Divulgation SomeotherVulation

Когда все команды выполнены правильно, удалите --dryrun вариант

...