3

У меня есть несколько подкаталогов, и я хотел бы переместить любые содержащиеся в них файлы в текущий каталог, используя однострочную команду терминала на Mac. Я знаю, что имена моих файлов не все уникальны и хотел бы добавить суффикс перед расширением файла.

Я нашел похожий вопрос Q: Переместить все файлы в подкаталогах в текущий каталог? который предлагает использовать:

find ./*/* -type f -print0 | xargs -0 -J % mv % . 

Но это полезно только для уникальных имен файлов. Например, дано следующее дерево:

.
├── bar
│   ├── test1.jpg
│   ├── test2.jpg
│   └── test3.jpg
├── foo
│   ├── test1.jpg
│   ├── test2.jpg
│   └── test3.jpg
├── qux
│   └── test3.jpg
└── corge
    └── test3.jpg

Я хотел бы видеть результат, похожий на:

.
├── bar
├── foo
├── qux
├── corge
├── test1.jpg
├── test1a.jpg
├── test2.jpg
├── test2a.jpg
├── test3.jpg
├── test3a.jpg
├── test3b.jpg
└── test3c.jpg

Кто-нибудь может помочь?

2 ответа2

0

Получить рекурсивный список всех обычных файлов в текущем каталоге для каждого файла, вырезать начальный "." и разрезает его, чтобы объединить каталог и имена файлов в одну уникальную строку, а затем переместить его в текущий каталог

list=$(find . -type f)
for file in $list; do
   echo -n "$file to "
   echo $file|cut -d '.' -f2-99| tr -d '/'
   mv "$file" ./"$(echo $file|cut -d '.' -f2| tr -d '/')"
done
0

Если строгое последовательное именование в вашем примере не является для вас супер-важным, я бы предложил вместо этого следующее решение:"будь проще" / "быстрое и грязное":

find . -type f |
while read filename; do
    basename=$(basename "$filename");
    newname=$(echo "$basename" | sed "s/^\(.*\)\(\.[^\.]\+\)$/\1(XXXX)\2/");
    printf "mv \"%s\" \"%s\";\n" "$filename" "$(mktemp -u "$newname")";
done

Это печатает только те команды, которые будут выполнены, поэтому проверьте работоспособность, просмотрев выходные данные, а затем скопируйте и вставьте в командную строку, если все в порядке.

По-английски: найдите мне все обычные файлы, преобразуйте их имена из «test1.jpg» в форму «test1(XXXX).jpg», где "XXXX" будет выбран и заменен на mktemp со случайными символами, затем создайте mv "командная строка для этого действия.

Чтобы еще больше снизить риск конфликта имен файлов, просто добавьте к нему еще "X".

Повеселись.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .