Синтаксис rsync
SRC DEST очень похож на синтаксис cp
SRC DEST, поэтому вы можете использовать что-то вроде
rsync -auv */*.{txt,doc} /home/joedoe/Books/
, чтобы скопировать все файлы *.txt и *.doc в целевой каталог.
Опции:
-a
режим архива (ярлык для-rlptgoD
)-u
пропускать более новые файлы на приемнике (, напримерcp -u
)-v
увеличить детализацию Поскольку опция архивирования -a
также включает рекурсивную опцию -r
, вы можете отключить этот флаг с помощью дополнительной --no-r
если вы хотите,(-a
также скопирует каталог Book/my.doc/
, поскольку он будет соответствовать шаблону *.doc
и -a --no-r
отключит рекурсию ).
Вывод с --dry-run
будет выглядеть следующим образом:
$ rsync --dry-run -auv */*.{txt,doc} /home/joedoe/Books/
sending incremental file list
created directory /home/joedoe/Books
Temp2.txt
Temp3.doc
Temp5.txt
Temp6.doc
sent 221 bytes received 69 bytes 580.00 bytes/sec
total size is 11 speedup is 0.04 (DRY RUN)
Вы можете добавить несколько аргументов -v
, чтобы получить более подробный вывод, например -vv
или -vvv
.
Сawk
:
awk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}' < input > output
Правильное заполнение пробелов и усечение.
В зависимости от awk
реализации это будет длина в байтах или символах (, которая будет иметь значение для многобайтовых -символов ). В любом случае, не на основе ширины отображения этих символов (, например, для символов двойной ширины -или ширины 0 -или TAB, которые не имеют ширины отображения 1 на терминалах ).
Примеры:
$ echo 'A|B|C|D' | awk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB C D
(каждая из этихA
B
C
D
графем состоит из одного символа, каждая состоит из одного байта в любой локали и имеет одинарную -ширину ).
$ echo 'A|B|Ç|D' | gawk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB Ç D
$ echo 'A|B|Ç|D' | mawk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB Ç D
(2 байта, 1 -ширина Ç
символ в UTF -8)
$ echo $'A|B|C\u0327|D' | gawk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB Ç D
$ echo $'A|B|C\u0327|D' | mawk -F'|' '{printf "%-1.1s%-3.3s%-4.4s%-6.6s\n", $1, $2, $3, $4}'
AB Ç D
1 -байт,1 -ширина C
в сочетании с 0 -шириной, 2 байта (в UTF -8 )объединение седилл для формирования 1 -ширины, 2 -символов, 3 -] байт Ç
графема, разложенная версия предварительно -составленного символа U+00C7 Ç
в предыдущем примере.
Чтобы принять во внимание отображаемую ширину символов, с некоторыми expand
реализациями (, хотя и не GNU expand
), и предполагая, что ввод не содержит символов TAB, и ни одно из полей ввода не превышает их выделенную ширину в первое место, вы могли бы сделать:
<input sed $'s/|/|\t/g;s/$/|\t/' | expand -t3,8,14,22 | sed 's/| //g' >output
Что на выходе printf '%s\n' 'A|B|C|D' $'A|B|\uc7|D' $'A|B|C\u327|D'
должно дать:
AB C D
AB Ç D
AB Ç D
Использование только bash
функциональности оболочки...
Для предоставленных данных выборки:
$ foo="A|B|C|D"; printf "%s%s %s %s \n" $(echo -e "${foo//|/ }" )
AB C D
$ foo="A|B|C\u0327|D"; printf "%s%s %s %s \n" $(echo -e "${foo//|/ }" )
AB Ç D
Для фиксированного вывода поля для каждого вопроса при условии, что ни одно из полей ввода не превышает максимальную указанную ширину:
$ foo="A|B|C|D"; printf "%-1.1s%-3.3s%-4.4s%-6.6s\n" $(echo -e "${foo//|/ }" )
AB C D
Для многобайтовых символов, таких как Ç
, возникает проблема, заключающаяся в том, что спецификатор ширины вprintf
(как встроенной bash
оболочке, так и автономной утилите )считает байты, а не многобайтовые символы. Таким образом, вы можете получить «неожиданный» вывод.
$ foo="A|B|\uc7|D"; /bin/printf "%-1.1s%-3.3s%-4.4s%-6.6s\n" $(echo -e "${foo//|/ }" )
AB Ç D
$ foo="A|B|\uc7|D"; /bin/printf "%-1.1s%-3.3s%-4.4s%-6.6s\n" $(echo -e "${foo//|/ }" ) | xxd
00000000: 4142 2020 c387 2020 4420 2020 2020 0a AB .. D .
$