Files
如何使用“文件”(創建應用程序名稱:Microsoft Word)的結果來搜尋特定的字元串?
我正在嘗試使用“文件”的結果,它返回有關我指定的文件的資訊。
例如
file *.doc 'all .doc extensions
然後返回有關文件的資訊,包括“創建應用程序的名稱:Microsoft Word”現在,我正在嘗試搜尋字元串“Word”的結果。我被困在這裡。我該怎麼做?
*這是我經過數小時搜尋後嘗試的。我只是不知道我在找什麼詞。請指教。
find . -type f -print0 | xargs -0 grep -lh "Microsoft Word" | xargs -I % mv % ../NewDirectory/
我認為這會在文件本身中搜尋字元串“Word”並將其移動到新目錄。
如果我理解正確,您希望將文件從目前目錄及其子目錄遞歸移動到另一個目錄,但前提是
file
命令將它們報告為“Microsoft Word”文件。也就是說,您對file "$filename" | grep 'Microsoft Word'
產生一些輸出的文件感興趣。一個簡單的方法是冷靜地處理事情並逐個文件。如果您只想要目前目錄中的文件,則可以使用
for
循環和萬用字元模式:for f in *.doc; do if … done
什麼條件?我們要測試是否
Microsoft Word
出現在 的輸出中file "$f"
。我file --
用來保護名稱以 . 開頭的文件-
。for f in *.doc; do if file -- "$f" | grep -s 'Microsoft Word'; then … fi done
我們需要做的就是添加命令來移動文件。
for f in *.doc; do if file -- "$f" | grep -s 'Microsoft Word'; then mv -- "$f" ../NewDirectory/ fi done
如果您還想在子目錄中查找文件,請使用
**
wilcard 模式進行遞歸通配。在 bash 中,它需要被啟動shopt -s globstar
(在 ksh93 中,你需要set -o globstar
,而在 zsh 中它是開箱即用的;其他 shell 缺少此功能)。請注意 bash ≤4.2 遵循指向目錄的符號連結。for f in **/*.doc; do if file -- "$f" | grep -s 'Microsoft Word'; then mv -- "$f" ../NewDirectory/ fi done
請注意,所有移動的文件都以 結尾
../NewDirectory/
,不會創建子目錄。如果要重現目錄樹,可以使用字元串操作構造來提取文件名的目錄部分,並mkdir -p
在必要時創建目標目錄。for f in ./**/*.doc; do if file "$f" | grep -s 'Microsoft Word'; then d="${f%/*}" mkdir -p ../NewDirectory/"$d" mv "$f" ../NewDirectory/"$d" fi done
file
您可能更喜歡parse 的輸出,而不是解析它的輸出,它會file -i
列印標準化的字元串。