仅移动 Linux 文件

仅移动 Linux 文件

我有一个路径 /participant/data,其中所有文件都在数据目录中。但是,我希望目录结构为 /participant/data/subdirectory,子目录包含所有文件。它需要像这样才能通过管道。

我的第一个想法是

mkdir /参与者/数据/子目录/

mv /参与者/数据/*.* /参与者/数据/子目录/

但是,这些文件没有文件扩展名,因此使用 *.* 不起作用。有什么建议吗?

答案1

只需移动所有内容:

mv /participant/data/* /participant/data/subdirectory/

这会抱怨无法移动subdirectory到其自身,但仍会按照您想要的方式将其他所有内容移动到该子目录中。

Bashshopt -s extglob添加了一些额外的通配符,例如!(xy|z)匹配所有内容,例如* 除了 xy或者z

shopt -s extglob
mv /participant/data/!(subdir) /participant/data/subdir/

(Zsh 可能有更多能够仅匹配文件的扩展通配符。)

如果您有更多子目录并且不想触碰它们,findfd可以使用或等工具仅对特定项目进行操作,在本例中仅对文件进行操作:

find /participant/data -maxdepth 1 -type f -exec mv {} /participant/data/subdir/ \;

mv -t使用and会稍微更有效率-exec +

find /participant/data -maxdepth 1 -type f -exec mv -t /participant/data/subdir {} +

前面(较慢)的例子也可以写成 shellfor循环:

for x in /participant/data/*; do
    if [[ -f $x ]]; then mv "$x" /participant/data/subdirectory/; fi
done

答案2

您可以使用*而不是*.*包含独立于文件名的所有文件。

但这也包括目录,也包括subdirectory,所以在移动文件时必须将其排除。

这可以通过扩展模式匹配函数实现。首先,您必须启用它们(针对当前会话):

$ shopt -s extglob

然后你可以使用以下方法处理除一个文件之外的所有文件path/!(excludedFile)

实施于mv

$ mv /participant/data/!(subdirectory) /participant/data/subdirectory/

除了一个文件之外,还有更多选项可以移动所有文件:https://www.baeldung.com/linux/move-all-files-except-one

答案3

对于您描述的情况,最简单的方法是:

cd /participant/data
mkdir .tempname
mv * .tmpname
mv .tmpname subdirectory

* 将匹配所有未隐藏的目录条目,即所有不以点开头的条目。由于我们暂时以点开头了子目录名称,因此它不匹配,并且数据中的所有条目都将被移动。现在,如果您有一些不想移动的条目,例如其他子目录,则必须使用更复杂的方法之一,例如 user1686 的详细答案中的方法。

相关内容