Считайте меня расстроенным... Последние 2 часа я провел, пытаясь понять, как заставить команду, в которой есть каналы, перекачивать этот вывод в цикл for. Краткий рассказ о том, что я пытаюсь сделать, а затем мой код.
Я использую xbmc в течение многих лет. Однако вскоре после того, как я начал, я экспортировал свою библиотеку, что оказалось скорее хлопотным, чем стоящим (особенно сейчас, когда я использую установленную схему именования папок и файлов, содержащихся в них). Я хочу удалить все файлы, добавленные xbmc, поэтому я решил написать скрипт, который удалит все необходимые файлы. Однако тут я столкнулся с проблемой.
Я пытаюсь использовать команду locate (из-за ее скорости), за которой следует grep (чтобы избавиться от всей файловой системы .tbn) и egrep (чтобы удалить папку .actors, которую xbmc создает из результатов), за которой следует команда sort (хотя сортировка не обязательна, я добавил ее во время отладки, чтобы вывод при тестировании был лучше). Проблема в том, что обрабатывается только первый файл, а дальше ничего. Я много читал в Интернете и понял, что bash создает новую подоболочку для каждого канала, и к тому времени, когда он один раз завершит цикл, переменная уже мертва. Так что я больше копался в том, как обойти это, и все, казалось, показывало, как я могу обойти это для циклов while, но ничего для циклов for.
Хотя мне нравится думать, что я компетентен в написании сценариев, у меня всегда возникают такие вещи, которые доказывают, что я все еще только изучаю основы. Любая помощь от людей умнее меня будет принята с благодарностью.
#!/bin/bash
for i in "$(locate tbn | grep Movies | egrep -v .actors | sort -t/ +4)"
do
DIR=$(echo $i | awk -F'/' '{print "/" $2 "/" $3 "/" $4 "/" $5 "/"}')
rm -r "$DIR*.tbn" "$DIR*.nfo" "$DIR*.jpg" "$DIR*.txt" "$DIR.actors"
done
Прочитав ответ ниже, я думаю, что лучший способ выполнить то, что я хочу, заключается в следующем. Буду рад любым советам по новому сценарию. Вместо того, чтобы просто копировать и вставлять сценарий @Charles Duffy, я хочу найти правильный / лучший способ сделать это в качестве учебного опыта, поскольку всегда есть лучший и лучший способ что-то закодировать.
#!/bin/bash
for i in "*.tbn" "*.nfo" "*.jpg" "*.txt" "*.rar" #(any other desired extensions)
do
find /share/movies -name "$i" -not -path "/share/movies/.actors" -delete
done
Сначала у меня есть часть -not -path
, чтобы удалить из вывода папку .actors, которую xbmc помещает в корень исходного каталога (в данном случае /share/movies), чтобы оттуда не удалялись эскизы (файлы .tbn), но я хочу, чтобы они были удалены из любых других каталогов, содержащихся в /share/movies (и я хотел бы удалить миниатюры из папки .actors, если она содержится в определенной папке фильма). Вариант -delete
связан с тем, что на странице gnu.org было предложено, что -delete
лучше, чем вызов /bin/rm
из-за отсутствия необходимости разветвления для процесса rm, что делает работу более эффективной и предотвращает накладные расходы.
Я почти уверен, что хочу, чтобы элементы в строке for были заключены в кавычки, поэтому в команде find используется буквальное значение *.tbn
. Чтобы дать вам представление о структуре каталогов, это довольно просто. Я хочу удалить любой из файлов *.tbn *.jpg и *.nfo в этих каталогах.
/share/movies/movie 1/movie 1.mkv
/share/movies/movie 1/movie 1.tbn
/share/movies/movie 1/movie 1.jpg
/share/movies/movie 1/movie 1.nfo
/share/movies/movie 2/movie 2.mp4
/share/movies/movie 2/movie 2.srt
/share/movies/movie 2/movie 2 (subs).rar
/share/movies/movie 3/movie 3.avi
/share/movies/movie 3/movie 3.tbn
/share/movies/movie 3/movie 3.jpg
/share/movies/movie 3/movie 3.nfo
/share/movies/movie 3/.actors/actor 1.tbn
/share/movies/movie 3/.actors/actor 2.tbn
/share/movies/movie 3/.actors/actor 3.tbn
find
или, может быть,xargs
. - person Beta   schedule 27.09.2014awk
? Я не уверен, почему вы не можете добиться того же эффекта с расширением встроенного параметра bash. - person Charles Duffy   schedule 27.09.2014dir=/${i#*/}
- person Charles Duffy   schedule 27.09.2014dir=${i%/*}
. См. BashFAQ № 73: mywiki.wooledge.org/BashFAQ/073. - person Charles Duffy   schedule 29.09.2014