
我不幸處理包含空格的檔名。我想連接檔案名稱包含空格的檔案。我還想按數字對文件名進行排序。顯然以下失敗:
cat $(ls *.sql | sort -n)
sincefoo bar.sql
作為兩個參數傳遞給cat
.這裡通常的方法是什麼?
答案1
這裡不需要ls
。它是透過展開 glob 來列出目錄內容的 shell *.sql
。
在 GNU 或 FreeBSD 系統上:
printf '%s\0' *.sql | sort -nz | xargs -r0 cat --
(使用\0
而不是\n
與一起-z/-0
確保它也適用於包含換行符的檔案名稱)。
請注意,數字排序-n
假定數字位於檔案名稱的開頭。
或者如果您有zsh
:
cat ./*.sql(.n)
(n
glob 限定詞用於啟用數字排序(當數字不是開頭時也有效,前提是所有文件名都具有相同的前綴(如file12.sql
, file2.sql
)。我.
還添加了僅包含常規文件。D
如果您還想要隱藏文件,請添加喜歡.foo.sql
)。
答案2
cat $(ls -1)
如果你重寫 IFS 就可以做到。 IFS 是 shell 變量,它告訴 BASH 使用哪些字元作為分隔符號。 IFS 的預設值是空格、製表符、換行符。如果你將 IFS 改為換行符,那麼你可以這樣做cat $(ls -1)
。
其他答案沒有任何問題,但這可能是關於如何處理一般空格的更直接的答案,而這個答案引入了大多數人不熟悉的 IFS 變數。
#!/bin/bash
dir=$(mktemp -d)
for x in $(seq 10); do
echo $x > "$dir/$(date) $x.txt"
done
pushd $dir
ls -1 $dir
# Set IFS to newline only inorder to deal with the spaces in the file names
#
oldIFS=$IFS
IFS=$'\n'
cat $(ls -1 $dir)
IFS=$oldIFS
輸出
[sri@localhost test]$ ./test
/tmp/tmp.IuXCBzbTLj ~/test
Mon Nov 17 06:38:52 EST 2014 10.txt
Mon Nov 17 06:38:52 EST 2014 1.txt
Mon Nov 17 06:38:52 EST 2014 2.txt
Mon Nov 17 06:38:52 EST 2014 3.txt
Mon Nov 17 06:38:52 EST 2014 4.txt
Mon Nov 17 06:38:52 EST 2014 5.txt
Mon Nov 17 06:38:52 EST 2014 6.txt
Mon Nov 17 06:38:52 EST 2014 7.txt
Mon Nov 17 06:38:52 EST 2014 8.txt
Mon Nov 17 06:38:52 EST 2014 9.txt
10
1
2
3
4
5
6
7
8
9
這是有關 IFS 的一些文件的連結。 http://bash.cyberciti.biz/guide/$IFS。我想我很久以前通過閱讀 O'Rielly 的 BASH 書了解了它。
答案3
使用xargs
(假設是 GNU 實作)與自訂分隔符號(假設檔案名稱不包含換行符):
ls -1d -- *.sql | sort -n | xargs -d "\n" cat --