找到所有可执行文件,并使用bash将其与文件夹一起复制到某个虚拟文件夹中



我正试图从文件夹中收集所有可执行文件,并试图将它们复制到虚拟文件夹中。我尝试了一些使用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/foosrcFlder/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"' _ {} ;

最新更新