Получить индекс аргумента с помощью 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, думал, что это было довольно опрятно.

Другие вопросы по тегам