Как я могу копировать файлы с именами, содержащими пробелы и UNICODE, при использовании сценария оболочки? - PullRequest
5 голосов
/ 31 марта 2010

У меня есть список файлов, которые я пытаюсь скопировать и переместить (используя cp и mv) в сценарии оболочки bash. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу заставить ни одну команду распознавать огромное количество файлов, по-видимому, потому что имена файлов содержат пробелы и / или символы Юникода. Я не смог найти никаких переключателей для декодирования / перекодирования этих символов. Вместо этого, например, если я копирую «file name.xml», я получаю «* .xml» и ошибку сценария, что файл не найден для моего результата. Кто-нибудь знает настройки или команды, которые будут работать с этими файлами?

РЕДАКТИРОВАТЬ (добавить текущий код): Когда я бегу:

MacBookPro: рабочий стол $ ./script.sh

#!/bin/sh
dateVar=`date +%Y-%m-%d`
mkdir /Volumes/Documents/SMSarchive/$dateVar
cd /Volumes/Documents/SMSarchive/SMSdrop
for i in *.xml
do
cp $i /Volumes/Documents/SMSarchive/$dateVar/$dateVar-$i
done

Я получаю сообщение:

использование: cp [-R [-H | -L | -P]] [-fi | -n] [-pvX] исходный_файл целевой_файл ср [-R [-H | -L | -P]] [-fi | -n] [-pvX] исходный_файл ... целевой_каталог

... когда он попадает в команду "cp". На самом деле в скрипте есть что-то еще, что обрабатывает скопированные файлы дальше. С "обычным" именем файла, например 'file.xml', все работает отлично. Это только файлы с пробелами или символами Unicode, где у меня проблемы.

Ответы [ 3 ]

17 голосов
/ 31 марта 2010

Проблемы с пробелами указывают на то, что недостаточно цитирования. Неверно следующее:

someprogram $file

Правильная версия выглядит следующим образом:

someprogram "$file"
1 голос
/ 31 марта 2010

следите за ошибками кода, когда $ i равно нулю! Это может быть результатом фатальных ошибок rm -Rf!

0 голосов
/ 18 февраля 2016

Иногда есть более простые способы, чем иметь дело с цитированием оболочки. В вашем случае я бы использовал find -print0 и xargs -0. Окончание нулевого символа позволяет вам легко манипулировать строками с пробелами (то есть списками имен файлов).

Для вашего примера код будет выглядеть примерно так:

#!/bin/sh
dateVar=`date +%Y-%m-%d`
mkdir /Volumes/Documents/SMSarchive/$dateVar
cd /Volumes/Documents/SMSarchive/SMSdrop
find . -maxdepth 1 -name '*.xml' -print0 | \
xargs -0 -I {} cp {} /Volumes/Documents/SMSarchive/$dateVar/$dateVar-{}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...