删除子目录而不删除其内容?

删除子目录而不删除其内容?

我有一个名为音乐的目录,其中有许多专辑和单独的曲目。其中一些位于子目录中。我想要的是删除此文件夹并混合音乐目录中的所有曲目而不分离。

手动执行此操作很难,所以我正在寻找一些命令。

答案1

没有find

shopt -s globstar
mv -nv **/*.mp3 /path/to/common/directory

答案2

find . -mindepth 1 -type f -exec mv -i "{}" /common/path \;
find . -mindepth 1 -d -type d -exec rmdir "{}" \;

这会将所有音乐从当前目录移动到,/common/path第二个将删除所有目录。然后您可以将所有内容移回原始目录。

另外,如果您想覆盖同名的文件,这会提示您。

答案3

find /path/to/music/ -type f -execdir mv -n "{}" /path/to/sharedmusic/ \;

具有重复名称的文件将不是被移动,而是留在原来的位置。

答案4

您可以完成子目录中所有文件的查找,然后执行该查找命令并将其移动到当前目录。

在下面的答案中可以找到一个例子。 https://stackoverflow.com/questions/22388480/how-to-pipe-the-results-of-find-to-mv-in-linux

引用答案:https://stackoverflow.com/a/22388545/879882

xargs通常用于此目的,并且mv有一个-t选项可以促进这一点。

find ./ -name '*article*' | xargs mv -t ../backup

如果你find支持-exec ... \+你也可以这样做

find ./ -name '*article*' -exec mv -t ../backup {}  \+

-t选项可能是 GNU 扩展。当然可以自己推出,也许类似

find ./ -name '*article*' -exec sh -c 'mv "$@" "$0"' ../backup {} \+

我们无耻地滥用了一个方便的事实,即后面的第一个参数sh -c 'commands'最终作为“脚本名称”参数,$0以便我们甚至不需要shift它。

相关内容