Получить индекс аргумента с помощью xargs?
В bash у меня есть список файлов с одинаковыми именами (в разных подкаталогах), и я хочу упорядочить их по времени создания / изменения, примерно так:
ls -1t /tmp/tmp-*/my-file.txt | xargs ...
Я хотел бы переименовать эти файлы с каким-то индексом или чем-то еще, чтобы я мог переместить их все в одну папку. Мой результат в идеале был бы что-то вроде:
my-file0.txt
my-file1.txt
my-file2.txt
Что-то вроде того. Как бы я поступил так?
2 ответа
Вы можете просто пройтись по этим файлам и добавить добавочный счетчик к желаемому имени файла:
for f in /tmp/tmp-*/my-file.txt; do
fname="${f##*/}"
fname="${fname%.*}"$((i++)).txt
mv "$f" "/dest/dir/$fname"
done
РЕДАКТИРОВАТЬ: Для сортировки перечисленных файлов мое время модификации, как в случае с ls -1t
Вы можете использовать этот скрипт:
while IFS= read -d '' -r f; do
f="${f#* }"
fname="${f##*/}"
fname="${fname%.*}"$((i++)).txt
mv "$f" "/dest/dir/$fname"
done < <(find /tmp/tmp-* -name 'my-file.txt' -printf "%T@ %p\0" | sort -zk1nr)
Это обрабатывает имена файлов со всеми специальными символами, такими как пробелы, символы новой строки, символы глобуса и т. Д., Поскольку мы заканчиваем каждое имя файла NUL или \0
персонаж в -printf
вариант. Обратите внимание, что мы также используем sort -z
для обработки NUL завершенных данных.
Итак, я нашел ответ на свой вопрос, мысли по этому поводу?
ls -1t /tmp/tmp-*/my-file.txt | awk 'BEGIN{ a=0 }{ printf "cp %s /tmp/all-the-files/my-file_%03d.txt\n", $0, a++ }' | bash;
Я нашел это из другого вопроса о переполнении стека, ища что-то похожее, что мой поиск сначала не нашел. Я был впечатлен линией awk, думал, что это было довольно опрятно.