файлы cp с шаблоном с переменной среднего каталога

Если запустить скрипт как

./test.sh

то он запускается в своей собственной, -не интерактивной оболочке, а не в текущей интерактивной оболочке. Вам понадобится

../test.sh

, что эквивалентно

source./test.sh

во втором примере.

См. В чем разница между поиском ('.' или «источник» )и выполнение файла в bash?

Что касается echo "$bb", расширение параметра не расширяет псевдонимы:

Aliases allow a string to be substituted for a word when it is used as the first word of a simple command.

0
10.01.2021, 16:43
3 ответа

Как я видел, в этом случае нет подкаталога с именем real, поэтому, если вы поделитесь своим настоящим именем каталога, возможно, у вас возникнут небольшие проблемы с вашими ключевыми словами. кстати, вы можете использовать «найти» со структурой @Kusalananda или использовать цикл for для копирования ваших файлов и каталогов

0
18.03.2021, 22:37

Это должно работать, если вы адаптируете его к своей структуре каталогов, и я вас правильно понимаю.

user@user:~$ tree

├── dir
└── foo
    ├── 10021
    │   └── live
    │       ├── a.jpg
    │       ├── b.jpg
    │       ├── c.jpg
    │       └── d.jpg
    ├── 10022
    │   └── live
    │       ├── e.jpg
    │       └── f.jpg
    └── 10023
        └── live
            ├── g.jpg
            ├── h.jpg
            ├── i.jpg
            └── j.jpg

Теперь помещено в ваш домашний каталог:

cp */live/*.{jpg,png} ~/dir/
0
18.03.2021, 22:37

Вы можете позволить оболочке сделать тяжелую работу с подстановочными знаками

shopt -s nullglob
cp */live/*.jpg */live/*.png dir/

Первая команда указывает оболочке bashне пренебрегать расширением шаблонов, которые не существуют, а вместо этого удалять их как несоответствующие -. (Например, из вашего вопроса в каталоге 10020/live/нет pngфайлов; обычно это означало бы, что команда в конечном итоге увидит литерал 10020/live/*.png, который не будет соответствовать, поскольку нет файла pngсо звездочкой в ​​качестве имени.)

Если вы не запускаете bash, вы можете перенаправить stderr вывод команды cpна null (cp... 2>/dev/null), чтобы не видеть сообщения об ошибках, генерируемые недопустимым сбоем. чтобы расширить шаблоны, такие как 10020/live/*.png, но вы также будете перенаправлять и другие сообщения об ошибках, так что это должен быть последний вариант шага.

Если вам действительно нужно чистое решение, вы можете копировать файлы один за другим, но это менее эффективно и, как правило, труднее читать

for file in */live/*.jpg */live/*.png
do
    [ -f "$file" ] && cp "$file" dir/
done

На самом деле вам не нужна косая черта в конце dir/, но я обычно пишу так, чтобы было совершенно ясно, что я намереваюсь dirбыть каталогом. (В крайнем случае, когда вы в конечном итоге скопируете только один файл, когда dirне существует, использование dir/вместо dirбезопасно завершится ошибкой, вместо того, чтобы молча переименовывать файл в dir.)

В обоих случаях вы можете добавить префикс echoк команде cp, чтобы увидеть команду, которая будет выполняться без каких-либо фактических изменений (, т. е. использовать echo cp …вместо простоcp …)

0
18.03.2021, 22:37

Теги

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