Имена файлов с пробелами для цикла, команда find

попробуйте

echo 32768 > /sys/block/md0/md/stripe_cache_size

и проверьте;)

1
задан 10 September 2013 в 15:42

8 ответов

Попробуйте процитировать цикл for следующим образом:

for FILE in "`find . -type f  -name '*.*'`"   # note the quotation marks

Без кавычек bash не обрабатывает пробелы и символы новой строки (\n) хорошо ...

Также попробуйте установить

IFS=$'\n'
10
ответ дан 24 May 2018 в 18:07
  • 1
    +1 для $ IFS. Это описывает разделительный символ. – Ray 16 December 2014 в 23:32
  • 2
    Это решение, которое сработало для меня. Я использовал comm для сравнения отсортированных списков файлов, и имена файлов имели пробелы в них, несмотря на то, что они не работали. Затем я увидел cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html и решение установки $ IFS с IFS = $ (echo -en "\ n \ b " ;) работал на меня. – pbhj 2 July 2015 в 02:41
  • 3
    Добавление двойных кавычек, элегантный, простой, красивый - спасибо! – Big Rich 14 July 2017 в 14:42

Это работает и упрощается:

find . -name '<pattern>' | while read LINE; do echo "$LINE" ; done

Подпишитесь на Rupa (https://github.com/rupa/z) для этого ответа.

6
ответ дан 24 May 2018 в 18:07

В дополнение к правильному цитированию вы можете указать find использовать разделитель NULL, а затем читать и обрабатывать результаты в цикле while

while read -rd $'\0' file; do
    something with "$file"
done < <(find  . -type f -name '*.*' -print0)

. Это должно обрабатывать любые имена файлов, которые совместимы с POSIX - см. man find

   -print0
          True; print the full file name on the standard output, followed by a null character (instead of the newline character that  -print  uses).   This  allows  file
          names that contain newlines or other types of white space to be correctly interpreted by programs that process the find output.  This option corresponds to the
          -0 option of xargs.
3
ответ дан 24 May 2018 в 18:07
  • 1
    это только решение, которое сработало для меня. Благодарю. – codefreak 8 November 2014 в 11:58
[F1]
1
ответ дан 24 May 2018 в 18:07

Я сделал что-то вроде этого, чтобы найти файлы, которые могут содержать пробелы.

IFS=$'\n'
for FILE in `/usr/bin/find $DST/shared -name *.nsf | grep -v bookmark.nsf | grep -v names.nsf`; do
    file $FILE | tee -a $LOG
done

Работали как шарм:)

1
ответ дан 24 May 2018 в 18:07

Большинство ответов здесь разбиваются, если в имени файла есть символ новой строки. Я использую bash более 15 лет, но только интерактивно.

В Python вы можете использовать os.walk (): http://docs.python.org/2/library/os.html#os .walk

И модуль tarfile: http://docs.python.org/2/library/os.html#os.walk

0
ответ дан 24 May 2018 в 18:07

Я думаю, вам может быть лучше с использованием опции -exec find.

find . -type f -name '*.*' -exec tar -cpf archive.tar {} +

Затем найдите команду, используя системный вызов, чтобы сохранить пробелы и символы новой строки (а не pipe, для чего требуется котирование специальных символов). Обратите внимание, что «tar -c» работает независимо от того, существует или нет архив, и что (по крайней мере, с bash) ни {}, ни + не нужно указывать.

0
ответ дан 24 May 2018 в 18:07

Как показано в minerz029, вам нужно указать расширение команды find. Вы также должны процитировать все подстановки $FILE в вашем цикле.

for FILE in "$(find . -type f  -name '*.*')"
do
    if [ ! -f archive.tar ]; then
        tar -cpf archive.tar "$FILE"
    else 
        tar -upf archive.tar "$FILE" 
    fi
done

Обратите внимание, что синтаксис $() должен быть предпочтительнее использования обратных тактов; см. этот U & amp; L вопрос. Я также удалил ключевое слово [[ и заменил его командой [, потому что это POSIX.

-1
ответ дан 24 May 2018 в 18:07
  • 1
    О [[ и [, кажется, что [[ новее и поддерживает больше функций, таких как подгонка и сопоставление регулярных выражений. [[ находится только в bash, но не sh – kiri 10 September 2013 в 15:01
  • 2
    @ minerz029 Да. Вот что я говорю. Я не знаю, что вы подразумеваете под [[, поддерживает подглаживание. Согласно вики Грега , внутри [[ не происходит глобирования. – Joseph R. 10 September 2013 в 15:05
  • 3
    Попробуйте [ "ab" == a? ] && echo "true", затем [[ "ab" == a? ]] && echo "true" – kiri 10 September 2013 в 15:09
  • 4
    @ minerz029 Это не глотание. Это регулярные выражения (слабо интерпретируемые). Это не глобус, потому что a* означает «a, за которым следует любое количество символов») а не «все файлы, чьи имена начинаются с a и имеют любое количество символов после этого». Попробуйте [ ab = a* ] && echo true против [[ ab == a* ]] && echo true. – Joseph R. 10 September 2013 в 15:16
  • 5
    Хорошо, [[ все еще выполняет регулярные выражения, а [ - нет. Должно быть, запутался – kiri 10 September 2013 в 15:18

Другие вопросы по тегам:

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