移动每个非目录文件


14

我有一个要清除的目录,其中包含文件和子目录。我想做的很简单:将所有文件移到另一个目录,但将所有子目录保留不变。

我在想类似的东西:

mv [*_but_no_dirs] ./other_directory

似乎应该有一种使用通配符*和正则表达式的简单方法...

有人有想法吗?


1
因此,将所有文件移动到一个子文件夹中,但忽略子目录中的任何文件吗?
Wilf 2014年

@Wilf:是的。
问号

2
在zsh中,您可以执行mv **/*(.) ./other_directory-使用bash,您需要诉诸外部命令,例如find
godlygeek

Answers:


12

正则表达式不在这里。bash中的通配符(与大多数其他shell一样)仅根据文件名而不是文件类型或其他特征来匹配文件。有一种按类型进行匹配的方法:/在模式的末尾添加使其仅匹配目录或指向目录的符号链接。这样,您可以移动目录,然后移动剩下的内容,然后再移动目录,这很麻烦,但可以。

tmp=$(TMPDIR=.. mktemp -d)
mv -- */ "$tmp"
mv -- * "$tmp"/other_directory/
mv "$tmp"/* .
rmdir "$tmp"

按类型匹配文件的标准方法是调用find

find . -name . -o -type d -prune -o -exec sh -c 'mv "$@" "$0"' other_directory/ {} +

在zsh中,可以使用glob限定符按类型匹配文件。在.预选赛符合规则的文件; 用于^/匹配所有非目录,或-^/还包括指向目录的符号链接。

mv -- *(.) other_directory/

在任何shell中,您都可以简单地循环。

for x in *; do
   if ! [ -d "$x" ]; then
     mv -- "$x" other_directory/
   fi
done

8

您可以使用类似

find . -maxdepth 1 \( ! -type d \) -exec sh -c 'mv  "$@" MYDIR' _ {} \;

首先,我们find通常只在当前目录中查看,然后通过使用! -type d 最后执行的sh所有内容并将其移至目标目录来忽略目录。您可以尝试 {} +以更快的速度结束。


2
请稍作解释...
问号

1
@Questionmark我已经更新了答案,并确实添加了一些解释。另外,值得访问mywiki.wooledge.org/UsingFind
Valentin Bajrami

你为什么建议-exec sh -c 'mv "$@" MYDIR' _ {} \;而不是-exec mv {} MYDIR \;?只是为了获得可以通过将更改为来简化\;的内容+?您可以使用-exec mv -t MYDIR {} +表格进行操作。
斯科特

@斯科特我不知道那面-t旗帜。我还在答案中解释说,+速度更快,但并非所有find版本都支持它。因此,上面的代码几乎与所使用的任何findshell 兼容。
Valentin Bajrami 2014年

1
@ val0x00ff:“……上面的代码与所使用的任何findshell 都几乎兼容。”的确如此,但是find … -exec mv {} MYDIR \;使用的资源少于… -exec sh -c 'mv "$@" MYDIR' _ {} \;
Scott

0

可能有点危险,但

cp * destination/
rm *

如果没有-r开关,则cp和rm都无法在目录上运行。


-1

我建议您仅将mv *.* destination/destination /作为您要移动的文件夹。



2
目录名称可以包含“点”,而文件名可以排除它(并且经常这样做),因此*.*将移动某些目录并保留一些文件,这不是请求者想要的。
dave_thompson_085'2013/

抱歉,这是完全错误的。它只会移动名称中带有点的任何内容,而不会移动任何不带名称的内容。点绝不是文件专用的,文件也不是必需的,因此,这只会随机选择文件和目录。
terdon

-2
mv $(ls -l | grep "^-" | awk '{print $9}') ./folder_where_move
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.