Files

如何使用“文件”(創建應用程序名稱:Microsoft Word)的結果來搜尋特定的字元串?

  • September 30, 2015

我正在嘗試使用“文件”的結果,它返回有關我指定的文件的資訊。

例如

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列印標準化的字元串。

引用自:https://unix.stackexchange.com/questions/232689