我正试图从文件夹中收集所有可执行文件,并试图将它们复制到虚拟文件夹中。我尝试了一些使用find的东西,但由于某些原因,它复制了.txt文件太
这真的没有那么简单,你知道:
find ./ -executable
在我的电脑上,我得到以下结果:
./20211214/Logs/2021-02-13.log
./20211214/Logs/2021-02-14.log
./20211214/Logs/2021-02-15.log
./20211214/Logs/2021-02-16.log
./20211214/Logs/2021-02-17.log
这并不奇怪:
ls -ltra 2021-02-17.log
-rwxrwxrwx 1 usr usr 441793 Feb 26 2021./2021-02-17.log
正如您所看到的:一个扩展名为"*"的文件。log";可以是可执行的。
它也在复制txt
文件,因为它们是可执行的。。。但是find
尝试还有一些问题:它也复制目录,而不仅仅是文件。
请注意,在源目录的不同子目录中,可以有几个具有相同名称的可执行文件,例如srcFlder/bar/foo
和srcFlder/baz/foo
。当在目的地复制它们时,最后一个会覆盖其他的。
如果您只想复制没有.txt
扩展名的可执行文件,并且不关心同名文件,可以尝试:
find srcFlder -type f -name '*.txt' -prune -o
-type f -perm /a+x -exec cp -f {} destinationFolder ;
如果你有更多的文件扩展名要排除,你可以用添加它们
find srcFlder -type f ( -name '*.txt' -o -name '*.log' ) -prune -o
-type f -perm /a+x -exec cp -f {} destinationFolder ;
最后,如果您关心具有相同名称的文件,则可以将源层次结构保留在目标目录中。要做到这一点,您必须在复制之前创建目标目录(如果它还不存在)。因此,如果找到的文件之一是srcFlder/bar/foo
,则在将srcFlder/bar/foo
复制到destinationFolder/bar/foo
之前先执行mkdir -p destinationFolder/bar
。使用小型bash脚本作为exec
命令的示例:
find srcFlder -type f -name '*.txt' -prune -o
-type f -perm /a+x -exec bash -c 'f="${1/#srcFlder/destinationFolder}";
mkdir -p $(dirname "$f"); cp "$1" "$f"' _ {} ;