Я знаю, что вы можете mkdir
создать каталог и touch
создать файл, но разве нельзя выполнить обе операции за один раз?
т.е. если я хочу сделать следующее, когда папка other
не существует:
cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
Ошибка:
cp: cannot create regular file `/my/other/path/here/cpedthing.txt': No such file or directory
Кто-нибудь придумал функцию как обходной путь для этого?
Ответы:
Используйте
&&
для объединения двух команд в одной строке оболочки:Примечание: ранее я рекомендовал использовать
;
для разделения двух команд, но, как указано в @trysis, вероятно, лучше использовать&&
в большинстве ситуаций, потому что в случаеCOMMAND1
сбояCOMMAND2
также не будет выполняться. (В противном случае это может привести к проблемам, которых вы, возможно, не ожидали.)источник
&&
, как;
и в случае, если первая команда не удалась, вторая команда все равно будет выполняться (и тоже не удастся, поскольку этот каталог еще не существует). С ,&&
если первая команда терпит неудачу, вторая команда не выполняется.mkdir -p /my/other/path/here && touch $_/cpredthing.txt
. В$_
раскрываться по существу «последнему аргументу в последней выполненной команде».touch
взять такой-p
параметр, какmkdir
делает.Сначала вам нужно создать все родительские каталоги.
Если вы хотите проявить творческий подход, вы можете создать функцию :
А затем используйте ее, как любую другую команду:
источник
&&
- Как это?supertouch "/tmp/abc/def ghi/jkl mno.txt"
но ничего не вышло. Все командыdirname
,mkdir
иtouch
дали erros.mktouch
это.Сделайте это с помощью / usr / bin / install:
когда у вас нет исходного файла:
источник
-D /dev/null
, что мне легче запомнить.Вот что бы я сделал:
mkdir -p /my/other/path/here && touch $_/cpredthing.txt
Здесь
$_
- переменная, представляющая последний аргумент предыдущей команды, которую мы выполнили в строке.Как всегда, если вы хотите увидеть, каким может быть результат, вы можете протестировать его с помощью
echo
команды, например:echo mkdir -p /code/temp/other/path/here && echo touch $_/cpredthing.txt
Что выводится как:
В качестве бонуса вы можете записать несколько файлов одновременно, используя расширение скобок, например:
Опять же, полностью тестируется с помощью
echo
:источник
источник
dirname -z "$@" | xargs -0 mkdir -p
вместо этого для повышения производительности. (Прекратите прятаться и присоединяйтесь, ради Пита! ;-)вы можете сделать это в два этапа:
источник
источник
как я видел и тестировал на форуме unix, это решает проблему
источник
нет необходимости в
if then
утверждениях ... вы можете сделать это в одной строке usign;
- или на двух строках -
-
-p
ошибка предотвращения возвращается, если каталог уже существует (это то, что я здесь искал :))источник
В особом (но не редком) случае, когда вы пытаетесь воссоздать ту же иерархию каталогов, это
cp --parents
может быть полезно.Например, если он
/my/long
содержит исходные файлы иmy/other
уже существует, вы можете сделать это:источник
если вам нужен простой фрагмент с одним параметром:
источник
rm -rf
команд. - † То есть часы , если вы придерживаетесь разумной политики управления версиями / резервного копирования ... в противном случае это могут быть месяцы.rm -rf
никогда не следует предлагать без надлежащих объяснений и предупреждений.