Як ви можете перемістити (або скопіювати) всі файли до каталогу з тим самим префіксом імені файлу?


9

Використання Bash

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

Припустимо для цієї мети, що всі імена файлів мають цю умову іменування:

<filename_prefix>.<filename_suffix>

Я дізнався, що це швидкий спосіб отримати всі файли з певним filename_suffixі помістити їх у папку dist:

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

Тепер крок далі ... як я можу використовувати в такому випадку вихід результату пошуку 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 source -name "*.xrt,*.ini,*.moo" -exec env file={} bash -c 'base="$(basename "$file")";dir="dst/${base%.*}";mkdir -p "$dir";cp "$file" "$dir"' \;

насправді робота над викликом сценарію bash у пошуку LOL.

= Р


1
Здогадайтесь, що станеться, якщо є файл, який називається… happy rm -rf /! Цей вид коду заслуговує на -1.
Стефан Гіменез

Вашого редагування недостатньо: скажімо, ви посилалися на посилання та завантажували Yay" rm -rf / "Rox0r.avi, знову виникає проблема…
Stéphane Gimenez

(І немає способу зробити цю заміну безпечною).
Стефан Гіменез

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.