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