我正在尝试查找名称以80s
.
ls 80s*/*
找到正确的文件,但find . -ipath '80s*/*'
不返回任何内容。find
此任务的正确命令是什么?
我需要使用,find
因为我想将所有此类文件移动到不同的文件夹并且不想解析ls
.
答案1
-ipath
匹配完整路径名,包括当前路径.
。所以你必须将其包含在你的模式中:
find . -ipath './80s*/*'
上面也将输出目录。要仅列出常规文件,请使用:
find . -ipath './80s*' -type f
(或者! -type d
对于除目录之外的任何类型的文件)
答案2
如果,正如你所说,80s*/*
匹配正确的文件,那么我根本看不出使用的理由find
。
要将所有匹配的名称移动80s*/*
到某个目标目录,destdir
您可以使用
mv -n 80s*/* destdir/
这会将所有非隐藏名称从任何匹配的目录移动80s*
到单个目录中destdir
。非标准-n
选项通常意味着“无破坏”,即如果存在名称冲突,则不覆盖文件。
如果使用 GNU ,您还可以使用选项(例如)或如上所述的()mv
来避免覆盖与其他文件同名的文件。--backup
--backup=numbered
-n
--no-clobber
如果您只需要挑选常规的文件,或者如果80s*/*
扩展到太长的名称列表,请使用循环:
for name in 80s*/*; do
[ ! -f "$name" ] && continue
mv -n "$name" destdir/
done
(这也会将符号链接移动到常规文件。为了避免这些情况,请另外使用-h
/测试-L
是否"$name"
是符号链接。)
在zsh
shell 中,您可以使用以下命令移动与您的模式匹配的所有常规文件
mv -n 80s*/*(.) destdir/
...其中 glob 限定符(.)
过滤前面模式的结果以仅包含常规文件((-.)
还包括常规文件的符号链接)。
如果你确实需要使用的话find
,再考虑一下
find ./80s*/ -path './80s*/*' -prune ! -name '.*' -type f \
-exec mv -n {} destdir/ \;
这匹配您感兴趣的名称,并避免隐藏名称(您说80s*/*
匹配正确,我认为这意味着不需要隐藏名称)。它梅子所有匹配的名称,这意味着它避免输入与模式匹配的子目录,然后,如果名称对应于常规文件,则将文件移动到像以前一样destdir
使用。mv -n
使用 GNU ,您可以通过使用代替原来的 来mv
使其更加高效。这将批量执行找到的文件名,而不是为每个名称调用一次。-exec mv -n -t destdir/ {} +
-exec
mv
mv