jus*_*ser 24 bash command find
我刚开始使用bash脚本,我需要使用具有多种文件类型的find命令.
list=$(find /home/user/Desktop -name '*.pdf')
Run Code Online (Sandbox Code Playgroud)
这段代码适用于pdf类型,但我想一起搜索多个文件类型,如.txt或.bmp.你有什么想法吗?
gho*_*oti 37
欢迎来到bash.这是一个古老,黑暗和神秘的东西,能够产生巨大的魔力.:-)
您询问的选项是针对该find命令,而不是针对bash.从命令行,您可以man find看到选项.
你要找的那个是-o"或":
list="$(find /home/user/Desktop -name '*.bmp' -o -name '*.txt')"
Run Code Online (Sandbox Code Playgroud)
那说...... 不要这样做. 像这样的存储可能适用于简单的文件名,但只要你必须处理特殊字符,如空格和换行符,所有的赌注都会被取消.有关详细信息,请参阅ParsingLs.
$ touch 'one.txt' 'two three.txt' 'foo.bmp'
$ list="$(find . -name \*.txt -o -name \*.bmp -type f)"
$ for file in $list; do if [ ! -f "$file" ]; then echo "MISSING: $file"; fi; done
MISSING: ./two
MISSING: three.txt
Run Code Online (Sandbox Code Playgroud)
路径名扩展(globbing)提供了一种更好/更安全的方式来跟踪文件.然后你也可以使用bash数组:
$ a=( *.txt *.bmp )
$ declare -p a
declare -a a=([0]="one.txt" [1]="two three.txt" [2]="foo.bmp")
$ for file in "${a[@]}"; do ls -l "$file"; done
-rw-r--r-- 1 ghoti staff 0 24 May 16:27 one.txt
-rw-r--r-- 1 ghoti staff 0 24 May 16:27 two three.txt
-rw-r--r-- 1 ghoti staff 0 24 May 16:27 foo.bmp
Run Code Online (Sandbox Code Playgroud)
该猛砸常见问题有很多关于bash编程等优秀的提示.
如果你想循环你"找到"的东西,你应该使用这个:
find . -type f -name '*.*' -print0 | while IFS= read -r -d '' file; do
printf '%s\n' "$file"
done
Run Code Online (Sandbox Code Playgroud)
资料来源:https://askubuntu.com/questions/343727/filenames-with-spaces-breaking-for-loop-find-command