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


22

Я ще не дуже добре знайомий з усіма хитрощами grep/find/awk/xargs.

Скажімо, у мене є деякі файли, що відповідають певному шаблону *.xxx. Ці файли знаходяться у випадкових місцях у певному каталозі. Як я можу знайти всі такі файли та перемістити їх у папку в моєму домашньому каталозі Unix (яка може ще не існувати)?


4
Ви повинні подбати, коли говорити про "тип файлу". У unixy середовищі приклад ".xxx" не є навіть розширенням у сенсі Windows. ".xxx" просто становить суфікс імені файлу. "Тип файлу" - це ще одна з декількох категорій: звичайний файл, файл пристрою, символічне посилання, каталог, названа труба, сокет сімейства Unix, можливо, кілька інших.
Брюс Едігер

1
Дивіться також: unix.stackexchange.com/questions/7027/…
jasonwryan

@BruceEdiger спасибі, я думаю, я дійсно мав на увазі "шаблон імені файлу"
qodeninja

Відповіді:



17

Якщо ви хочете перемістити всі файли всередині ієрархії каталогів до одного каталогу призначення, в bash ≥4 (помістіть shopt -s globstarу свій ~/.bashrc) або zsh:

mkdir ~/new-directory
mv -i **/*.xxx ~/new-directory

В інших оболонках:

mkdir ~/new-directory
find . -name '*.xxx' -exec mv -i {} ~/new-directory \;

Як прочитати цю findкоманду:

  • .: пройти поточний каталог
  • -name '*.xxx': діяти у файлах, ім'я яких відповідає цьому шаблону
  • -exec … \;: виконуйте цю команду на кожному файлі, замінюючи {}шлях до файлу

Існує більш складна команда, findяка швидше використовується , якщо у вас є багато файлів, оскільки не потрібно викликати окремий mvпроцес для кожного файлу:

find . -name '*.xxx' -exec sh -c 'mv -i "$@" "$0"' ~/new-directory {} +

В +кінці вказується findвикликати команду на декількох файлах одночасно. Оскільки findможна розмістити імена файлів лише в кінці командного рядка і mvпотрібно мати останній каталог призначення, ми використовуємо проміжну оболонку для перестановки аргументів ( "$0"це перший аргумент для оболонки ~/new-directory, і "$@"це наступні аргументи, що надходять від findрозширення {}).


4

Якщо ви хочете скопіювати структуру каталогів відповідних вихідних файлів у новий цільовий каталог, ви можете скористатися параметром --parents GNU cp :

mkdir /path/to/target_dir
cd source_dir
find . -name '*.xxx' -exec cp -iv --parents -t /path/to/target_dir {} +

3

Ви можете використовувати знахідку без , а-exec‍ також:

mkdir /path/to/dest    
cp `find /path/to/source -name "*.jar"` /path/to/dest

1
Однак зауважте, що find -execце набагато безпечніше; вище, не вдасться, наприклад, назви файлів, що містять пробіл.
даг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.