Переміщення файлів за допомогою find + xargs: target - це не каталог?


9

Коли я запускаю таку команду:

> mkdir some_dir
> find /foo/bar/ -name '*.csv' -print0 | xargs -0 mv {} some_dir

Я отримую сотні рядків, які говорять:

mv: target `/foo/bar/XX.csv` is not a directory

Чому? Я думав, що xargs виконає:

mv /foo/barXX.csv some_dir

для кожного findзнайденого файлу . Що відбувається? До речі, це з zsh

Оновлення:

Оновлення1:

Я намагався:

find /foo/bar/ -name '*.csv' -print0 | xargs -0 mv {} -t some_dir

але тоді я отримав кілька рядків типу:

mv: cannot stat `{}': No such file or directory

хоча я думаю, що команда правильно переміщує мої файли.

Оновлення2:

Мені, здається, не потрібен -tваріант, коли ви користуєтеся mvокремо. Наприклад

> touch file1.txt
> touch file2.txt
> mkdir my_dir
> mv  file1.txt  file2.txt  my_dir

працює добре. Навіщо мені це потрібно -tпри використанні xargs?

Відповіді:


14

Якщо у вас є GNU ( find, xargs, & mv), змінити свою команду до наступного:

$ find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir

уривок зі mvсторінки man

   -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY

Вищезгадане xargs ...побудує команду так, що виклики для переміщення будуть такими:

 $ mv 1.csv 2.csv 3.csv ... -t some_dir

Не потрібні xargs

Ви можете пропустити такий підхід, просто виконавши findвсю роботу:

$ find /foot/bar/ -name '*.csv' -exec mv -t some_dir {} +

Навіщо вам це потрібно mv -t ...?

Це пов'язано з тим, xargsяк будується набір файлів для передачі команді, яку він запускатиме кожен раз (тобто mv ...).

Коли ви запускаєте mvкоманду вручну самостійно, ви контролюєте, скільки імен файлів передано до неї, і тому вам не потрібно буде турбуватися про необхідність, -t my_dirоскільки ви завжди будете ставити каталог призначення останнім.

Список літератури


Дякую! Це дуже корисно. Я трохи розгублений (див. Мої оновлення)
Амеліо Васкес-Рейна

1
Побудована команда, mv -t some_dir 1.csv 2.csv 3.csv ...тому аргументи файлів останні. Це помилка в питанні, для того , щоб використовувати {}ви повинні пройти -I {}до xargs.
frostschutz

Дякую. Це все пояснює. Що щодо другого питання, яке виникло в оновлення 2? Чи знаєте ви, чому мені не потрібні -tкілька файлів та каталог із звичайною mv?
Амеліо Васкес-Рейна

1
@ user815423426 - Я оновлю його пізніше, коли отримаю можливість сьогодні ввечері, я знаю, чому.
slm

@ user815423426 - Я оновив питання, повідомте, чи має сенс Wrt mv -t.
slm

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