仅使用 mv 移动文件夹

仅使用 mv 移动文件夹

我有一个包含文件和文件夹的文件夹。

folder/file1.jpg
folder/file2.jpg
folder/file3.jpg
folder/subfolder1/file1.txt
folder/subfolder1/file2.txt
folder/subfolder2/file1.txt
folder/subfolder3/
destination/

我想将所有文件夹(及其内容)移动到新文件夹中,但不移动文件。

例如。

folder/file1.jpg
folder/file2.jpg
folder/file3.png
destination/subfolder1/file1.txt
destination/subfolder1/file2.txt
destination/subfolder2/file1.txt
destination/subfolder3/

我知道,如果我想选择所有 jpeg 文件(例如),我会这样做mv folder/*.jpg destination。但是选择所有文件夹的命令是什么?

答案1

为此,您只需要在 * 末尾添加一个额外的 / ,如下所示:

mv folder/*.jpg destination (match only jpg files) 
mv folder/* destination (match anything found)
mv folder/*/ destination  (match only the folders) 

这只会将“文件夹”内的文件夹移动到目标,而不是“文件夹”内的文件(请注意,子文件夹中的文件将被移动)。

答案2

如果子文件夹有统一的名称,您可以使用罗艾玛的回答。如果没有,您可以使用一个简单的 shell 循环:

mkdir -p destination
for name in folder/*; do
    [ ! -d "$name" ] && continue
    mv "$name" destination
done

这将循环遍历folder(文件和目录等)中的所有目录条目,测试每个目录条目是否是目录,如果是,则移动它们。

另一种可能性是使用find

mkdir -p destination
find folder -mindepth 1 -maxdepth 1 -type d -exec mv {} destination ';'

这将找到所有目录的所有路径名folder(但不是下面的目录,也不是目录folder本身),并将每个找到的目录移动到destination.

答案3

根据实际的目录名称,您可以使用它

mv folder/subfolder* destination/

如果没有模式 ( subfolder*) 来匹配文件夹名称,您可以这样做

find folder -mindepth 1 -maxdepth 1 -type d -exec mv {} destination/ \;

甚至这个

find folder -mindepth 1 -maxdepth 1 -type d -exec mv -t destination/ {} +

相关内容