Как вы можете переместить (или скопировать) все файлы в каталог с одинаковым префиксом имени файла?


9

Использование Bash

Допустим, у меня есть несколько файлов, случайно размещенных в родительском каталоге ~/src, я хочу получить все файлы, соответствующие определенному суффиксу, и переместить (или скопировать) их в ~/distкаталог.

Для этого предположим, что все имена файлов имеют следующее соглашение об именах:

<filename_prefix>.<filename_suffix>

Я обнаружил, что это был быстрый способ получить все файлы с определенными данными filename_suffixи поместить их в папку dist:

mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;

Теперь шаг вперед ... как я могу использовать выходные данные find, в этом случае filename, и использовать filename_prefixдля создания каталога с тем же именем ~/distи затем переместить (или скопировать) все файлы с этим префиксом в соответствующий каталог?

mkdir ~/dst
find source -name "*.xrt,*.ini,*.moo" -exec mv -i {} -t ~/dst \;

По сути, как мне изменить вышеуказанную команду (или, возможно, использовать другую команду), чтобы создать структуру, подобную этой

(ВЫВОД)

~/dist/people/people.xrt
~/dist/games/games.xrt
~/dist/games/games.moo
~/dist/games/games.ini
~/dist/monkeys/monkeys.ini
~/dist/monkeys/monkeys.xrt

из дерева каталогов, как это?

(ВХОД)

~/src/xrt/people.xrt
~/src/xrt/games.xrt
~/src/conf/games.ini
~/src/pack/monkeys.xrt
~/src/e344/games.moo
~/src/e344/monkeys.moo
~/src/en-us/monkeys.ini

Ответы:


10

Было бы чертовски сказать, findчто делать в этом случае.

Лучше использовать оболочку:

for i in **/*.{xrt,ini,moo}; do
  FILE=$(basename "$i")
  DIR=~/dst/${FILE%.*}
  echo mkdir -p -- "$DIR"
  echo mv -i -t "$DIR" -- "$i"
done

Используйте, shopt -s globstarчтобы **глобус работал (или используйте zsh!). И удалите echos позже, если команда напечатает то, что вы хотите.


используя bash это то же самое?
qodeninja

@codeninja shopt -s globstar, см. мое редактирование. Если есть только два уровня, вы можете использовать */*.*и фрагмент будет работать в любой оболочке.
Жиль "ТАК ... перестать быть злым"

2

читерская командная строка find:

find source -name "*.xrt,*.ini,*.moo" -exec env file={} bash -c 'base="$(basename "$file")";dir="dst/${base%.*}";mkdir -p "$dir";cp "$file" "$dir"' \;

на самом деле обходной путь для вызова сценария bash в find LOL.

= Р


1
Угадайте, что произойдет, если есть файл, который называется ... happy rm -rf /! Этот вид кода заслуживает -1.
Стефан Гименес

Ваше редактирование не достаточно: допустим, вы кликнули по ссылке и скачали Yay" rm -rf / "Rox0r.avi, снова возникла проблема ...
Стефан Гименес

(И нет никакого способа сделать этот вид замены безопасным).
Стефан Гименес

1
Ах, может быть, это можно сделать по-другому. Кажется , что следующие работы: -exec bash -c 'command which uses "$1"' bash '{}' ';'. Ну, это все равно бессмысленно.
Стефан Гименес

1
@ StéphaneGimenez готово, bash - не единственное, что нужно использовать. LOL
yuyichao
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.