Командная строка: как обрабатывать пробелы в именах файлов

383
escapecharacter

Я измеряю общий размер группы файлов, пути которых я сохранил в текстовом документе files.txt. Пример содержимого файла files.txt:

file1.txt file2.txt file3.txt 

Эта команда оболочки дает мне вывод, который я хочу:

$ du -hc $(cat files.txt) 

если у меня нет имени файла с пробелами в нем, например: file 9.txtЗатем, du -hcпытается проанализировать имя файла в пробеле. Неважно, куда я помещаю цитаты, в файле files.txt или в моей команде оболочки, он все равно анализируется неправильно. Что мне делать вместо этого?

К вашему сведению, мой документ со списком файлов является выводом команды вроде так:

find ~/Dropbox/ -type f -iname "*.BMP" >> bmpfound.txt 

Детали моей системы: MacOS, используя oh-my-zsh в Terminal.app

1
Если у вас есть `xargs`, попробуйте` cat files.txt | xargs -I {} du -hc "{}" `, но это, вероятно, не удастся с именами файлов с` "`. Возможно, безопаснее сделать это в loop `while read line; do du -hc" $ line "; сделано Paulo 6 лет назад 0
Если ваш `du` принимает arg` --files0-from`, используйте его и измените свою находку, добавив `-print0`. meuh 6 лет назад 2

1 ответ на вопрос

1
ZeroKnight

Используйте -print0опцию в findи труба, чтобы xargs -0:

find ~/Dropbox/ -type f -iname "*.BMP" -print0 | xargs -0 du -ch 

В качестве альтернативы, как отметил Гордон Дэвиссон, это можно упростить:

find ~/Dropbox/ -type f -iname "*.BMP" -exec du -ch {} + 

Любой из них должен работать с именами файлов, которые содержат пробелы, или любой другой тип глупых символов.

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

xargs -0 du -ch < bmpfound.txt 
Если вам не нужно сохранять результаты `find` в файле, вы можете сделать его еще проще с помощью` find ~ / Dropbox / -type f -iname "* .BMP" -exec du -ch {} + ` Gordon Davisson 6 лет назад 1
@GordonDavisson Бриллиант! Сначала я пробовал маршрут `-exec du`, но почему-то полностью пропустил синтаксис` + `. Это очень удобно. ZeroKnight 6 лет назад 0