2012-06-04 3 views
2

Я пытаюсь скопировать ряд файлов и папок с помощью BASH в Ubuntu. Важно, чтобы файлы копировались в алфавитном порядке, потому что они идут в цифровом кадре изображения, который считывает файлы в том порядке, в котором они были добавлены на флешку. Из того, что я обнаружил, Nautilus копирует их на основе номера inode, поэтому они не работают на кадре.Скопируйте файлы в папки в алфавитном порядке в BASH Ubuntu

Из поиска я сделал, я придумал с помощью следующей команды:

for i in "$(find * -type f -print0 | sort)"; do cp -v "$i" "/media/PicFrame/$i"; done 

, что приводит к ошибке, что имя файла слишком длинное. Похоже, что BASH пытается создать файл с каждым именем файла, разделенным «\ n». Я попытался удалить некоторые кавычки, но это приводит к нескольким ошибкам «не могу стати» при попытке скопировать фрагменты имен файлов (так как в них много пробелов).

Любые идеи о том, как сделать эту работу? Я открыт для других методов, но мне бы очень хотелось, чтобы это была одна команда/сценарий, которую я могу запускать каждый месяц, когда я меняю фотографии. (Я делаю это в Windows, но сейчас пытаюсь сделать все в Ubuntu. Я вернулся туда и обратно около двух лет.)

ответ

2

Используйте read вместо while.

find ... | while read file 
do 
    cp ..."$file"... 
done 

Возможно, вы захотите рассмотреть возможность использования rsync.

+0

Sweet, rsync выглядит как раз то, что мне нужно. Благодаря! – user1055261

+1

Кроме того, для первого, чтобы он работал, он должен удалить '-print0' из' find' – mVChr

+1

@mVChr: ​​или добавить '--files0-from = -' в' sort', если его версия поддерживает его (это вероятно, это происходит, так как он использует Ubuntu). –

2

Как сказал Игнасио, вы должны использовать петлю while read, если используете find.

Если вам не нужна рекурсия (ваши файлы находятся на одном уровне каталога), вы можете использовать петлю for с globbing. При использовании этого метода вам не нужно использовать sort, так как glob, как гарантируется, будет расширен в лексикографическом порядке для вашей локали (другими словами, «отсортирован»).

for file in * 
do 
    cp "$file" dest 
done 

Следует отметить, что часть проблемы со сценарием в вашем вопросе является то, что вы используете print0 к трубе выход find в sort. Чтобы иметь эту работу, вам понадобится соответствующая опция sort, если у вас есть ее версия.

find ... -print0 | sort --files0-from=- 
Смежные вопросы