我有一个路径 /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 可能有更多能够仅匹配文件的扩展通配符。)
如果您有更多子目录并且不想触碰它们,find
则fd
可以使用或等工具仅对特定项目进行操作,在本例中仅对文件进行操作:
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 的详细答案中的方法。