2016-09-01 33 views
1

我的工作目錄中有幾個文件,我想打印所有的文本文件,問題出在我的WD上也是目錄。這意味着,當我輸入:Bash:使用通配符區分文件和目錄

cat * 

輸出是:

9 Tom Grapes 28 
10 Ben Lemon 21 
11 Paul Lime 37 

Next cool file 

cat: yang: Is a directory 
cat: ying: Is a directory 

我想刪除這些 '錯誤信息',所以我嘗試:

cat *[!/] 

,但它只是退貨:

cat: '*[!/]': No such file or directory 

但是另一種方式ar ound:只有

cat */ 

打印:

cat: yang: Is a directory 
cat: ying: Is a directory 

這是否意味着一切,甚至文件結尾加上一個斜線?如果是,是否有辦法區分文件和目錄?如果沒有,爲什麼這個通配符不起作用?

PS:我使用的是Linux

+3

的注意事項旁白:你正在使用bash,但如果你是自由選擇外殼,你可以考慮使用Zsh。在zsh中很難解決的幾個問題很容易(儘管有時看起來有點神祕)。在你的情況下,Zsh命令將是'cat *(^ /)'。括號中的表達式表示「沒有目錄」。就像bash的對手一樣,如果沒有純文件就會出錯。如果你想在這種情況下,貓只是不寫任何東西,你會做'貓*(N^/)/ dev/null'。 * N *表示:如果沒有文件匹配,則用空字符串替換glob模式。 – user1934428

回答

2

*任何表情只是指文件名本身,而不是類型。除非你有獨特的命名約定(例如,文件都有擴展名,目錄永遠不會),否則很難根據文件名和目錄名區分文件和目錄。

尾隨/不是名稱的一部分。

快速和骯髒的解決方案:

cat * 2>/dev/null 

這除了剛剛抑制所有錯誤消息。 (實際上,它將它們重新設置爲空白。)

如果我想正確地做,這將是我的第一步。它可能不是最好的解決方案,但是它會遍歷目錄中的所有條目,檢查它是否是一個文件,並且只有這些文件纔是cat

for f in *; do 
    if [[ -f $f ]]; then 
     cat $f 
    fi 
done 

可以在一行中寫入:

for f in *; do if [[ -f $f ]]; then cat $f; fi; done 

也許別人在這裏有一個更好的主意。

+0

它的工作原理,但我不知道爲什麼,無論如何。我想我會在bash上放大,當我有一些技術訣竅時回到這個答案。但是你能解釋我嗎,爲什麼我的建議命令不起作用? – Uuser

+0

我編輯了我的答案,詳細闡述了我的工作。 – chw21

+0

我給你一個簡單的例子,我有3個文件:'文件1','文件2','文件3'。爲了得到'file3',你可以使用'cat * [3]'來獲得與你可以使用'cat * [!3]'相反的結果,第一個命令你會得到'file3' '會得到'file1'和'file2'。回到我的問題:'cat * /'只會返回錯誤,因爲只有目錄被引用。現在反之亦然:僅引用'not-directories'(= files)我將使用'cat * [!/]',但這很奇怪,不起作用。這是我的觀點,我希望現在能更好地理解它。 – Uuser

4
find -maxdepth 1 -type f -exec cat {} + 

編輯:

要忽略隱藏文件

find -maxdepth 1 -type f -name '[!.]*' -exec cat {} + 

參考:Exclude hidden files when searching with Unix/Linux find?

+1

當然,你可以使用'find'。但是你不是在用大錘來打破堅果嗎? – chw21

+2

另請注意:這會找到隱藏的文件。這可能是你想要的,也可能不是。 – chw21

+1

@ chw21關於隱藏文件的好處,可以通過添加'-not -path'./.*''避免使用'find'來避免它是一個搜索文件的命令,所以我不認爲這是錯誤的工具在這裏使用 – Sundeep