Есть ли умный способ выполнять операции копирования и перемещения или команду для дублирования файла без необходимости выполнять cd
, затем mv
, в той же папке?
Например, мне нужно выполнить следующее:
mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt
Обратите внимание, что каталог, куда я перемещаю файл, является тем же самым, но я должен снова поместить весь путь, и иногда это раздражает. Мне любопытно узнать, есть ли другой способ сделать это без необходимости заново указывать весь путь , потому что операция будет выполняться по тому же пути.
Ответы:
Просто используйте расширение скобки :
Это эквивалентно написанию:
Разумеется, расширение скобок позволяет вам предоставить больше аргументов. Вы даже можете передать ему диапазоны, например, чтобы создать пару тестовых папок, вы можете запустить
mkdir test_{a..z}
, и, начиная с Bash 4, вы можете также создавать последовательности с нулями, например, intouch foo{0001..3}
, который создаетfoo0001
,foo0002
иfoo0003
. В Bash Hackers Wiki есть статья с несколькими примерами для вас.Если вам нужно использовать две разные команды, сначала используйте подоболочку и
cd
там, как в ответе @ Ignacio .источник
brace
расширении, спасибо!meniac ~: mv /tmp/f1/f2/f3/f4/f5/f6/{file.txt, file2.txt} mv: cannot stat ``/tmp/f1/f2/f3/f4/f5/f6/{file.txt,': No such file or directory
/bin/bash
, и у вас нет сценария, который есть/bin/sh
в shebang или какой-либо другой оболочке, которая не поддерживает расширение скобок? Если вы бежитеset
, выSHELLOPTS
содержитеbraceexpand
?file.txt,
иfile2.txt
. Не должно быть пробела .mv /folder1/folder2/folder3/file{,-2013}.txt
Запустите операцию в подоболочке.
Изменение рабочего каталога не будет распространено на родительскую оболочку.
источник
ash
,dash
,ksh88
Не говоря уже о старой оболочке Bourne являются примером оболочек , не поддерживающих его.Если вы хотите умный, вот расширение истории Bash
Я бы не использовал это сам, так как я не могу запомнить. Иногда я использую эквивалент vim , но должен искать его почти каждый раз.
источник
Вы можете установить переменную. Конечно, у этого есть побочный эффект оставления переменных вокруг.
источник
(D="/folder1/folder2/folder3"; mv "$D"/file.txt "$D"/file-2013.txt)
или просто добавляяunset
команду в конце. (Я добавил кавычки как «лучшую практику»; если вы привыкли всегда использовать кавычки, вам не придется останавливаться и чесать голову, когда появляется путь, содержащий специальные символы.)cd
чем установить переменную. Не намного легче, я признаю.Мне нравятся другие решения, но вот еще одно, реализованное в виде скрипта с массивами bash, pushd, popd:
источник
Slhck напрямую отвечает на вопрос самым простым из возможных способов, но Вальтеру также нравится ответ autopop, так что вот такой же;
источник