Мне нужно переместить файлы из папки в подпапку, и этот процесс может быть выполнен более одного раза, поэтому подпапка не может быть пустой.
Предположим, что структура выглядит следующим образом:
renatospaka@dell-w10home:~/devlpm$ ls -la
total 24
drwxr-xr-x 4 renatospaka renatospaka 4096 Sep 8 12:36 .
drwxr-xr-x 10 renatospaka renatospaka 4096 Sep 8 12:34 ..
drwxr-xr-x 2 renatospaka renatospaka 4096 Sep 8 12:36 api
-rw-r--r-- 1 renatospaka renatospaka 10 Sep 8 12:36 file1.txt
-rw-r--r-- 1 renatospaka renatospaka 10 Sep 8 12:36 file2.txt
drwxr-xr-x 2 renatospaka renatospaka 4096 Sep 8 12:34 new
Есть это превосходноевопросиз которого я извлек следующую команду: ls | grep -v new | xargs mv -t new
. Она действительно работает и перемещает содержимое вновыйпапка. Однако, начиная со второго выполнения, появляется ошибка, так как папка назначения не пуста, и процесс завершается аварийно.
Как исправить эту проблему? Я пробовал несколько комбинаций флагов, xargs
но все они не увенчались успехом...
решение1
mv
жалуется, потому что не получает никаких аргументов от xargs
. Добавьте -r
, чтобы предотвратить xargs
выполнение, если входные данные пусты:
-r, --no-run-if-empty
If the standard input does not contain any nonblanks, do not run the command. Normally, the command is run once even if there is no in‐
put. This option is a GNU extension.
Кроме того, вы можете контролировать mv
поведение при наличии пункта назначения:
Видеть man mv
:
-f, --force
do not prompt before overwriting
-i, --interactive
prompt before overwrite
-n, --no-clobber
do not overwrite an existing file
Так:
... | xargs -r mv -f -t new
Однако ваша команда имеет серьезные проблемы, когда в ваших файлах есть новые строки или даже пробелы. В общем,не анализировать выводls
.