我需要将文件从文件夹移动到子文件夹,这是一个可以多次执行的过程,因此子文件夹可能不为空。
假设结构如下:
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
。