Я пытаюсь создать оболочку для одного liner, чтобы найти все jpegs в каталоге рекурсивно. Затем я хочу скопировать их во внешний каталог, переименовав их в соответствии с их датой и временем, а затем добавьте случайное целое число, чтобы избежать перезаписи изображений, имеющих одну и ту же метку времени.Найти рекурсивные/xargs/cp/awk/sed/одиночные кавычки в одиночной кавычки вместе в одном слоте
Первая попытка:
find /storage/sdcard0/tencent/MicroMsg/ -type f -iname '*.jpg' -print0 | xargs -0 sh -c 'for filename; do echo "$filename" && cp "$filename" $(echo /storage/primary/legacy/image3/$(stat $filename |awk '/Mod/ {print $2"_"$3}'|sed s/:/-/g)_$RANDOM.jpg);done' fnord
Среди прочего, выше не работает, потому что есть одиночные кавычки о AWK внутри ш -с одинарных кавычек.
Вторая попытка должна сделать то же самое без ш -с, но дает мне эту ошибку на стат:
stat: can't stat '': No such file or directory
/system/bin/sh: file: not found
Вторая попытка:
find /storage/sdcard0/tencent/MicroMsg/ -type f -iname '*.jpg' -print0 | xargs -0 file cp "$file" $(echo /storage/primary/legacy/image3/$(stat "$file" | awk '/Mod/ {print $2"_"$3}'|sed s/:/-/g)_$RANDOM.jpg)
Я думаю, что проблема с Вторая попытка может быть слишком много подоболочек?
Может ли кто-нибудь помочь мне узнать, где я здесь ошибся?
На другом примечании: если кто знает, как сохранить актуальный измененный штамп даты/времени при копировании файла, мне бы понравился этот бросок здесь.
Спасибо Спасибо
Что увлечение с однострочником? Он просто делает для нечитаемого кода. Если вы имеете в виду один конвейер, это совсем другое; он не должен находиться на одной линии. –
Вы можете написать сценарий, а не искать «неопрятный» одиночный лайнер, чтобы сделать его нечитаемым. – iqstatic
Нужно ли использовать все эти команды? Может ли он просто использовать Perl или Python? Не могли бы вы написать сценарий оболочки, который обрабатывает список файлов ('для файла в $ @", do ... code here для одного файла ...; done'), а затем использовать 'find ... -exec script.sh {} +'. Это позволяет избежать необходимости «xargs». Вероятно, вы можете использовать 'stat -c '% y'' (или'% Y'), чтобы получить время изменения файла, сохраняя пост-обработку вывода 'stat'. –