Как отсортировать имена файлов с пробелами в них и связать файлы?

У Вас, вероятно, есть проблемы с SELinux. Принятие Вас имеет акцент на безопасность (Вы работаете над обратной петлей ssh, в конце концов), и не хотят отключать его, делать следующее как корень:

 restorecon -R -v /home/git/.ssh

Если Вы действительно хотите отключить его, в конце концов, то отредактируйте/etc/selinux/config и установите SELINUX=permissive в нем.

2
17.11.2014, 12:11
3 ответа

Нет необходимости в LS здесь. Это оболочка, которая перечисляет содержимое каталога, расширяя *. SQL GLAC.

На системе GNU или FreeBSD:

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

(использование \ 0 вместо \ N вместе с -Z / -0 гарантирует это также Работает с именами файлов, содержащих новинку символов).

Обратите внимание, что числовая сортировка с -N предполагает, что номер находится в начале имени файла.

Или если у вас есть ZSH :

cat ./*.sql(.n)

(:

cat ./*.sql(.n)

( N Challifier - включить числовую сортировку (также работает, когда номер не находится в начале при условии, что все имена файлов имеют Тот же префикс (вроде file12.sql , file2.sql ). Добавил . Также включает только обычные файлы. Добавить D Если вы также хотите скрытые файлы, такие как .foo.sql ).

7
27.01.2020, 21:50

можно сделать $ кошки (ls-1) при переопределении IFS. IFS Является переменной оболочки, которая говорит Bash который символы использовать в качестве deliminator. Значение по умолчанию для IFS является пространством, вкладкой, новой строкой. При изменении IFS на просто новую строку затем, можно сделать $ кошки (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. Я думаю, что узнал об этом давным-давно путем чтения книги Bash O'Rielly.

1
27.01.2020, 21:50

Используйте xargs (предполагая реализацию GNU) со специальным разделителем (предполагая, что имена файлов не содержат новых строк):

ls -1d -- *.sql | sort -n | xargs -d "\n" cat --
1
27.01.2020, 21:50

Теги

Похожие вопросы