Для тривиальных сообщений (никакие escape-последовательности, никакие опции), echo
прекрасен. Как только Вам нужно что-то более сложное, Вы использование shoud printf
который является портативным (т.е. ведите себя то же независимо от ОС), и позволяет намного лучшее форматирование, разрабатываемое с того же имени C функция.
Если Вы хотите звонить echo
в Вашем примере корректный путь был бы также:
echo -n "blah" >/dev/udp/localhost/8125
или
echo "blah\c" >/dev/udp/localhost/8125
в зависимости от echo
реализация Вы используете.
Я нашел этот пример на Так, названным: Терминал - Удаляет Все Папки Не файлы Conatining .mp3.
#! /bin/bash
find -depth -type d | while read -r D
do
v=$(find "$D" -iname '*.mp3')
case "$v" in
"" )
echo "$D no mp3"
# rm -fr "$D" #uncomment to use
;;
esac
done
Демонстрационные данные.
.
|-- 1
| |-- 1.mp3
| `-- 1.txt
|-- 2
| `-- 2.mp3
|-- 3
| `-- 3.txt
|-- 4
| `-- 4.txt
|-- 5
| `-- 5.mp3
|-- 6
| `-- 61
| `-- 61.mp3
|-- 7
| `-- 71
| `-- 71.txt
`-- deletenomp3.bash
Если бы я должен был выполнить его, то это удалило бы следующее:
$ ./deletenomp3.bash
./7 no mp3
./7/71 no mp3
./4 no mp3
./3 no mp3
Можно просто расширить это путем добавления больше -name
аргументы 2-й находке управляют в сценарии. Пример, для добавления .wav
файлы:
v=$(find "$D" -iname '*.mp3' -o -iname '*.wav');
Это говорит *.mp3
ИЛИ *.wav
. Добавить больше или другие:
v=$(find "$D" -iname '*.mp3' -o -iname '*.flac' -o -iname '*.m4a');
Я уверен, что этот блок мог быть сжат, если бы у Вас было намного больше типов файлов с помощью альтернативы, переключающейся на find
.
Забавное решение включает a find
внутри a find
, но более безопасным способом, чем принятый ответ (мне лично не нравится анализировать вывод команды, будучи ls
или find
, особенно без мер предосторожности). Следующая команда распечатает папки, которые не содержат музыкального файла (здесь, средство музыкального файла имеет расширение mp3
, flac
, ogg
, wav
или m4a
, но не стесняйтесь добавлять еще немного):
find . -depth -type d \! -exec sh -c 'find "$1" \( -iname "*.mp3" -o -iname "*.flac" -o -iname "*.ogg" -o -iname "*.wav" -o -iname "*.m4a" \) -type f | read a' _ {} \; -print
Необходимо попробовать это в системе, когда Вы счастливы способ, которым она ведет себя, замените финал -print
с -exec rm -rfv -- {} \;
Путем имена файлов используются, здесь делает этот метод 100%-м сейфом относительно имен файлов с забавными символами (т.е. пробелы, цитирования, новые строки, запаздывающие новые строки, продвижение и конечные пробелы, и т.д.).
Попробуйте что-то вроде (непротестированного):
for dir in ~/Music/* ; do
found=false
# Add your music file extensions here.
for file in "$dir"/*.{mp3,wav} */ ; do
if ls "$file" > /dev/null 2>&1 ; then
found=true
break
fi
done
if ! $found ; then
# Remove 'echo' when you are ready.
echo rm -vrf "$dir"
fi
done
Я не уверен, сколько оболочки поддерживают */
globbing. По крайней мере, Bash и Zsh делают.