Расширяя ответ от 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
Чтобы сопоставить любую не -пустую строку символов, не содержащую ]
, используйте [^]]+
.
Использование [^\]]*
будет соответствовать не -\
, за которым следует ноль или более ]
. Вот почему вам удалось разобрать 1
и 2
, но не другие строки.
Переменная IFS
не используется в вашем первом фрагменте кода. Переменные внутри [[... ]]
не нуждаются в двойных кавычках.
Чтобы напечатать отдельные элементы массива, используйте
printf '%s\n' "${MATCHES[@]}"
или
for elem in "${MATCHES[@]}"; do
printf '%s\n' "$elem"
done
Просто $MATCHES
расширится только до первого элемента массива (и применит разбиение на слова и подстановку имени файла к значению ).