Регулярное выражение Bash и разделение IFS

Расширяя ответ от Anderson M. Гомеса, Bash позволяет вам ссылаться на любой предыдущий каталог в вашем стеке каталогов, набрав ~N (или ~+N), где N - позиция в стеке dir. Например:

# go some places
$ cd /path/to/source/directory
$ pushd /path/to/destination/directory
$ pushd $HOME
$ pushd /tmp

# show the current dir stack
$ dirs -v
0 /tmp
1 ~
2 /path/to/destination/directory
3 /path/to/source/directory

Теперь вы можете скопировать файл между двумя прошлыми каталогами, ни один из которых не является текущим, с помощью:

cp -v ~3/file1.txt ~2

Чтобы решить проблему, о которой писал автор, вы должны сделать:

$ cd /path/to/source/directory
$ pushd /path/to/destination/directory

# show the current dir stack
$ dirs -v
0 /path/to/destination/directory
1 /path/to/source/directory

# copy
cp -v ~1/file[123].txt .

При большом наборе файлов вы можете перечислить их имена в файле манифеста, а затем выполнить копирование из исходного каталога:

$ cd /path/to/destination/directory
$ pushd /path/to/source/directory

# copy
cp -v $(cat files_to_copy.list) ~1

См. также: этот раздел man-страницы Bash


Аналогично, в Tcsh вы можете использовать обозначение =2 (а не ~2) для ссылки на второй dir в вашем dir-стеке.

См. также: этот раздел страницы Tcsh man

0
27.02.2019, 17:11
1 ответ

Чтобы сопоставить любую не -пустую строку символов, не содержащую ], используйте [^]]+.

Использование [^\]]*будет соответствовать не -\, за которым следует ноль или более ]. Вот почему вам удалось разобрать 1и 2, но не другие строки.

Переменная IFSне используется в вашем первом фрагменте кода. Переменные внутри [[... ]]не нуждаются в двойных кавычках.

Чтобы напечатать отдельные элементы массива, используйте

printf '%s\n' "${MATCHES[@]}"

или

for elem in "${MATCHES[@]}"; do
    printf '%s\n' "$elem"
done

Просто $MATCHESрасширится только до первого элемента массива (и применит разбиение на слова и подстановку имени файла к значению ).

3
28.01.2020, 02:22

Теги

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