Перемещение файлов с помощью команды 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

Обновить:

Update1:

Я старался:

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

но потом я получил несколько строк вроде:

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

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

Update2:

Мне кажется, мне не нужна эта -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справочной страницы

   -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так как вы всегда ставите каталог назначения последним.

Ссылки

SLM
источник
Спасибо! Это очень полезно. Я немного смущен, хотя (см. Мои обновления)
Амелио Васкес-Рейна
1
Созданная команда mv -t some_dir 1.csv 2.csv 3.csv ...так, что аргументы файла являются последними. Это ошибка в вопросе, чтобы использовать, {}вы должны перейти -I {}к xargs.
frostschutz
Спасибо. Это все объясняет. Как насчет второго вопроса, который у меня был в обновлении 2? Знаете, почему мне не нужны -tнесколько файлов и каталог с обычным mv?
Амелио Васкес-Рейна
1
@ user815423426 - Я обновлю его позже, когда у меня будет возможность сегодня вечером, я знаю почему.
SLM
@ user815423426 - Я обновил вопрос, дайте мне знать, если это имеет смысл в отношении mv -t.
SLM
1

Вы также можете использовать команду ls вместо команды find:

ls /foot/bar/*.csv | xargs  mv -t some_dir
Луис Анхель Родригес
источник