Как перебирать файлы, возвращаемые ls

Эта ошибка была исправлена ​​в OpenSSH 7. См. здесь для темы.

Это сообщение появилось из-за того, что злоумышленники пытались войти на ваш сервер. Не волнуйтесь, это нормально. Добро пожаловать в Интернет. Просто создайте хорошие пароли и отключите вход в систему root, и все будет готово.

В Openssh 7вы увидите, что это будет выглядеть примерно так:

localhost sshd[26793]: fatal: Unable to negotiate with 192.168.100.243: no matching key exchange method found. Their offer: diffie-hellman-group-exchange-sha1 [preauth]

0
21.10.2019, 02:39
4 ответа

Процитировав $(..), вы получите один токен, а не N токенов:

Я начну с пары образцов файлов:

$ ls
a.mp3 b.mp3 c.mp3

Если я сделаю то же, что и вы, я получу одну строчку со всеми тремя:

for i in "$(ls *.mp3)"; do
    echo "--> $i"
done
--> a.mp3 b.mp3 c.mp3

Если я опускаю кавычки вокруг $(...), я получаю три разные выходные строки:

for i in $(ls *.mp3); do
    echo "--> $i"
done
--> a.mp3
--> b.mp3
--> c.mp3

Если у вас есть файлы с пробелами, то что-то вроде этого может решить вашу проблему (обратите внимание, что это относится только к файлам в текущем каталоге):

До

$ ls
'DaftPunk VeridisQuo.mp3'  'French79 AfterParty.mp3'  'French79 BetweentheButtons.mp3'  'French79 Hometown.mp3'

Используйте findдля переименования:

$ find *.mp3 -maxdepth 1 -type f -name *.mp3 -exec mv {} "electro_{}" \;
$ ls
'electro_DaftPunk VeridisQuo.mp3'  'electro_French79 AfterParty.mp3'  'electro_French79 BetweentheButtons.mp3'  'electro_French79 Hometown.mp3'

Почему я предложил find *.mp3, а не просто find. -type f -name '*.mp3'...?

$ find. -maxdepth 1 -type f -name '*.mp3' -exec mv {} "electro_{}" \;
mv: cannot move './French79 Hometown.mp3' to 'electro_./French79 Hometown.mp3': No such file or directory
mv: cannot move './French79 BetweentheButtons.mp3' to 'electro_./French79 BetweentheButtons.mp3': No such file or directory
mv: cannot move './French79 AfterParty.mp3' to 'electro_./French79 AfterParty.mp3': No such file or directory
mv: cannot move './DaftPunk VeridisQuo.mp3' to 'electro_./DaftPunk VeridisQuo.mp3': No such file or directory
3
28.01.2020, 02:13

Я предпочитаю использовать его напрямую:

for x in *.mp3
do 
    mv./"$x"  "electro_$x"
done
9
28.01.2020, 02:13

То, что вы пытаетесь сделать, это простое массовое -переименование, которое легко обрабатывается perl-утилитой rename(, также известной как prenameилиfile-rename). Это НЕ то же самое, что и утилита renameв пакете util-linux(, которая имеет совершенно другие и несовместимые параметры командной строки -и возможности ).

Попробуйте

rename -n 's/^/electro_/' *.mp3

Опция -nделает это пробным -запуском, который только покажет вам, как файлы.mp3 будут переименованы, если вы позволите. Чтобы на самом деле переименовать их, либо удалите -n, либо замените его на -vдля подробного вывода.

$ touch DaftPunk_VeridisQuo.mp3 French79_AfterParty.mp3 French79_BetweentheButtons.mp3

$ ls -l
total 2
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 DaftPunk_VeridisQuo.mp3
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 French79_AfterParty.mp3
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 French79_BetweentheButtons.mp3

$ rename -v 's/^/electro_/' *.mp3
DaftPunk_VeridisQuo.mp3 renamed as electro_DaftPunk_VeridisQuo.mp3
French79_AfterParty.mp3 renamed as electro_French79_AfterParty.mp3
French79_BetweentheButtons.mp3 renamed as electro_French79_BetweentheButtons.mp3

$ ls -l
total 2
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 electro_DaftPunk_VeridisQuo.mp3
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 electro_French79_AfterParty.mp3
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 electro_French79_BetweentheButtons.mp3
2
28.01.2020, 02:13

Используйте IFS для установки разделителя. Разбивая на новые строки, пробелы не являются проблемой.

IFS=$(echo -en "\n\b")
for x in $(ls -1 *.mp3); do mv "$x" "electro_${x}"; done

Естественно, вы можете спросить, почему бы просто не

IFS='\n'

Это связано с тем, что $()или обратные кавычки — это подстановка команд, которая отбрасывает завершающие символы новой строки.

Из руководства BASH

\n newline

\b backspace

Как я понимаю, это "возврат" (перемещение влево )для предотвращения удаления завершающего символа новой строки, что позволяет повторять его вfor(каждом )цикле.

Это обсуждается более подробно в несколькихдругихstackoverflowвопросах

0
28.01.2020, 02:13

Теги

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