スペースを含むファイル名をソートしてファイルをリンクする方法は?

スペースを含むファイル名をソートしてファイルをリンクする方法は?

スペースを含むファイル名の処理に問題があります。ファイル名にスペースを含むファイルをリンクしたいです。また、ファイル名を数字でソートしたいと思います。明らかに、次は失敗します。

cat $(ls *.sql | sort -n)

以降はにfoo bar.sql2つの引数として渡されますcat。ここで一般的なアプローチは何ですか?

答え1

ここでは必要ありませんls。 globsを展開してディレクトリの内容を一覧表示するシェルです*.sql

GNUまたはFreeBSDシステムの場合:

printf '%s\0' *.sql | sort -nz | xargs -r0 cat --

(with\0の代わりに改行文字を含むファイル名にも機能します)。\n-z/-0

数値ソートでは、-n数値がファイル名の先頭にあると仮定します。

または、次の場合zsh

cat ./*.sql(.n)

(glob修飾子は数値ソートを有効にするために使用されます(すべてのファイル名に同じプレフィックス(たとえば、、)が含まれてnいる場合は数字が開始でない場合でも機能します。)、通常のファイルのみを含めるように追加しました。以下を追加してください。file12.sqlfile2.sql.D.foo.sql

答え2

cat $(ls -1)IFSを再構築すると、これを行うことができます。 IFS は、区切り文字として使用する文字を 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 --

関連情報