如何对包含空格的文件名进行排序并连接文件?

如何对包含空格的文件名进行排序并连接文件?

我不幸处理包含空格的文件名。我想连接文件名包含空格的文件。我还想按数字对文件名进行排序。显然以下失败:

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 --

相关内容