Я использую оболочку Bash на сервере Ubuntu 12.04 LTS, и кажется, что IFS = $ '\n' рассматривается как IFS = 'n'.

Используемый скрипт:

concat=$(echo -n "concat:" && find /home/jhvisser/bin/Streamripper_rips -name '*.aac' -mtime -1 -exec echo -n "{}|" \;)
echo $concat
IFS=$'\n'
for i in =$(echo "$concat" | sed -e 's/^concat://' -e 's/|$//' -e 's/|/\n/g');
    do rm "$i"
done

Вывод $(echo "$concat" | sed -e 's/^concat://' -e 's/|$//' -e 's/|/\n/g') :

rm: cannot remove `=/home/jhvisser/bi': No such file or directory
rm: cannot remove `/Streamripper_rips/Safe A': No such file or directory
rm: cannot remove `d Sou': No such file or directory
rm: cannot remove `d - Capital Cities (1).aac\n/home/jhvisser/bi': No such file or directory
rm: cannot remove `/Streamripper_rips/U Got It Bad - Usher.aac\n/home/jhvisser/bi': No such file or directory
rm: cannot remove `/Streamripper_rips/Life Of The Party - PRTY H3RO.aac\n/home/jhvisser/bi': No such file or directory
rm: cannot remove `/Streamripper_rips/i': No such file or directory
rm: cannot remove `complete/True Love - Pi': No such file or directory
rm: cannot remove `k.aac\n/home/jhvisser/bi': No such file or directory
rm: cannot remove `/Streamripper_rips/i': No such file or directory
rm: cannot remove `complete/The Other Side - Jaso': No such file or directory
rm: cannot remove ` Derulo.aac\n/home/jhvisser/bi': No such file or directory
rm: cannot remove `/Streamripper_rips/Karma - Kristi': No such file or directory
rm: cannot remove `a Maria.aac': No such file or directory

Это ломается на каждом «н». Проверьте ниже, чтобы увидеть правильные имена всех файлов:

/home/jhvisser/bin/Streamripper_rips/Safe And Sound - Capital Cities (1).aac
/home/jhvisser/bin/Streamripper_rips/U Got It Bad - Usher.aac
/home/jhvisser/bin/Streamripper_rips/Life Of The Party - PRTY H3RO.aac
/home/jhvisser/bin/Streamripper_rips/incomplete/True Love - Pink.aac
/home/jhvisser/bin/Streamripper_rips/incomplete/The Other Side - Jason Derulo.aac
/home/jhvisser/bin/Streamripper_rips/Karma - Kristina Maria.aac

Мне интересно, почему это может происходить? Разве это не должно ломаться на каждой новой строке?

Для более подробной информации о том, что делается, проверьте этот чат.

3 ответа3

4

как предложено:

Проблема заключалась в том, что этот скрипт bash вызывался с помощью sh: во многих системах Linux sh - это тире, а не bash. Цитирование ANSI-C является функцией bash.

В идеале добавить #!/bin/bash в качестве первой строки скрипта, дать ему разрешение на выполнение и вызвать его напрямую.

1

Почему бы просто не find /home/jhvisser/bin/Streamripper_rips -name '*.aac' -mtime -1 -delete?

1

У меня нет разрешения на публикацию комментариев, поэтому я должен был опубликовать это как ответ:

Попробуйте выйти из \, замените s/|/\n/g на s/|/\\n/g .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .