Итак, если я нахожусь в своем домашнем каталоге и хочу переместить foo.c в ~ / bar / baz / foo.c, но эти каталоги не существуют, есть ли способ автоматически создать эти каталоги, чтобы вам нужно будет только набрать
mv foo.c ~/bar/baz/
и все бы получилось? Кажется, вы могли бы использовать псевдоним mv для простого сценария bash, который проверял бы, существуют ли эти каталоги, а если нет, вызывал бы mkdir, а затем mv, но я решил проверить, есть ли у кого-нибудь идея получше.
Ответы:
Как насчет этой однострочной (в Bash):
Разбивая это:
создает каталог (включая все промежуточные каталоги), после чего:
перемещает файл в этот каталог ($ _ раскрывается до последнего аргумента, переданного предыдущей команде оболочки, т.е. во вновь созданный каталог).
Я не уверен, насколько это будет работать в других оболочках, но это может дать вам некоторые идеи о том, что искать.
Вот пример использования этой техники:
источник
./
везде? Аргументы не являются командами в PATH без.
каталога ...--parents
недоступно в macOS 10.13.2. Вам нужно использовать-p
.mkdir -p ./some/path/foo; mv yourfile.txt $_:h
источник
dirname
не требует существования своего аргумента, это чисто манипулирование строками. Не могу говорить за другие распределения. Ничего плохого в этом коде нет.for f in *.txt; do mkdir -p `dirname /destination/${f//regex/repl}`; mv "$f" "/destination/${f//regex/repl}; done
Сохранить как скрипт с именем mv или mv.sh
Или поместите в конец файла ~ / .bashrc функцию, которая заменяет mv по умолчанию на каждом новом терминале. Использование функции позволяет bash сохранять память, вместо того, чтобы каждый раз читать файл скрипта.
Они основаны на представлении Криса Лутца.
источник
mv
команду. Особенно полезно для сценариев, то есть вы не обязательно хотите запускать проверки и запускать вmkdir -p
любое время, когда вам нужно их использоватьmv
. Но так как я хотел бы использовать поведение ошибки по умолчанию дляmv
, я изменил имя функции наmvp
- так, чтобы я знал, когда я мог бы создавать каталоги.[ ! -a "$dir" ]
я проводил эксперименты, когда правая половина была истинной и ложной, оба оценивали как истинную ??? Ради других, tmp = "$ {tmp: -1}", кажется, захватывает последний символ файла, чтобы убедиться, что это не путь (/)Вы можете использовать
mkdir
:Простой скрипт, чтобы сделать это автоматически (не проверено):
источник
Похоже, ответ нет :). Я на самом деле не хочу создавать псевдоним или функцию просто для этого, часто потому, что она одноразовая, и я уже в процессе ввода
mv
команды, но я нашел кое-что, что хорошо работает для этого:Если
mv
произойдет сбой (dir не существует), он создаст каталог (который является последним аргументом предыдущей команды, так же$_
как и он). Так что просто запустите эту команду, затем upповторите ее, и на этот раз всеmv
получится.источник
Возможно, следующий сценарий оболочки?
Это основная часть. Возможно, вы захотите добавить немного для проверки аргументов, и вы можете захотеть изменить поведение, если место назначения существует, или каталог источника существует, или не существует (то есть не перезаписывать то, что не существует) ,
источник
Команда rsync может выполнить эту задачу только в том случае, если последний каталог в пути назначения не существует, например, для пути назначения,
~/bar/baz/
еслиbar
существует, ноbaz
не существует , то можно использовать следующую команду:rsync -av --remove-source-files foo.c ~/bar/baz/
В этом случае
baz
каталог будет создан, если он не существует. Но если и то,bar
и другоеbaz
не существует, rsync потерпит неудачу:Так что в основном это должно быть безопасно использовать
rsync -av --remove-source-files
в качестве псевдонима дляmv
.источник
Самый простой способ сделать это:
Давайте предположим, что я скачал pdf-файлы, расположенные в моем каталоге загрузки (
~/download
), и я хочу переместить все их в каталог, который не существует (скажем,my_PDF
).Я наберу следующую команду (убедившись, что мой текущий рабочий каталог
~/download
):Вы можете добавить
-p
опцию,mkdir
если вы хотите создавать подкаталоги так: (предполагается, что я хочу создать подкаталог с именемpython
):источник
Более глупый, но рабочий способ:
Создайте каталог с помощью mkdir -p, включая временный каталог с общим именем файла назначения, затем удалите этот каталог с простым rmdir и затем переместите файл в новое место назначения. Я думаю, что ответ с использованием dirname, вероятно, является лучшим, хотя.
источник
источник
Код:
Пример:
аргументы: "d1", "d2 / sub"
источник
Это переместится
foo.c
в новый каталогbaz
с родительским каталогомbar
.-p
Опцияmkdir
будет создавать промежуточные каталоги по мере необходимости.Без
-p
всех каталогов префикс пути уже должен существовать.Все внутри обратных галочек
``
выполняется, и результат возвращается в строке как часть вашей команды.Поскольку
mkdir
ничего не возвращает, в командуecho $_
будет добавлен только вывод .$_
ссылается на последний аргумент ранее выполненной команды.В этом случае он вернет путь к вашему новому каталогу (
~/bar/baz/
), переданныйmkdir
команде.Я распаковал архив без указания места назначения и хотел переместить все файлы, кроме
demo-app.zip
моего текущего каталога, в новый каталог с именемdemo-app
.Следующая строка делает трюк:
ls -A
возвращает все имена файлов, включая скрытые файлы ( кроме неявных.
и..
).Символ канала
|
используется для передачи выводаls
командыgrep
( командная строка, утилита поиска в виде простого текста ). Флаг направляет , чтобы найти и вернуть все имена файлов , исключающие . Этот список файлов добавляется в нашу командную строку как исходные аргументы команды перемещения . Аргумент target - это путь к новому каталогу, который передается по ссылке с использованием и выводится с помощью .-v
grep
demo-app.zip
mv
mkdir
$_
echo
источник
Вы даже можете использовать расширения скобок:
Вы должны использовать Bash 3.0 или новее.
источник
источник
Мое однострочное решение:
источник
Вы можете объединить команды:
mkdir ~/bar/baz | mv foo.c ~/bar/baz/
или скрипт оболочки здесь:
1. Откройте любой текстовый редактор.
2. Скопируйте и вставьте скрипт оболочки.
3. Сохраните его как mkdir_mv.sh.
4. Введите каталог вашего скрипта:
cd your/script/directory
5. Измените режим файла :
chmod +x mkdir_mv.sh
6. Установите псевдоним :
alias mv="./mkdir_mv.sh"
Теперь, когда вы запускаете команду,
mv
каталог будет создан, если он не существует.источник
Основываясь на комментарии в другом ответе, вот моя функция оболочки.
Включите это в .bashrc или подобное, чтобы вы могли использовать его везде.
источник