如何對包含空格的檔案名稱進行排序並連接檔案?

如何對包含空格的檔案名稱進行排序並連接檔案?

我不幸處理包含空格的檔名。我想連接檔案名稱包含空格的檔案。我還想按數字對文件名進行排序。顯然以下失敗:

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)

nglob 限定詞用於啟用數字排序(當數字不是開頭時也有效,前提是所有文件名都具有相同的前綴(如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 --

相關內容