На этот вопрос уже есть ответ здесь:
Скажем, мне нужно переместить файл /etc/dir1/dir2/dir3/a.out
в /etc/dir1/dir2/dir3/b.out
Набирать весь путь дважды - утомительно, да и переход в каталог может быть не идеальным. Есть ли способ сделать такое перемещение без повторного ввода каталога?
По поводу смежного вопроса (который, как я подозреваю, имеет такое же решение). Скажем, я хочу переместить файл someverybigfilename.png
в somereallybigfilename.png
. Есть ли способ сделать это без повторного ввода имени?
(Я знаю, что могу использовать сценарий. Но поддерживает ли mv
что-то подобное?)
Короче говоря: как я могу использовать move для частичного изменения/изменения только части имени файла? Как сделать небольшое изменение типа расширения?
В первом случае, если Вы используете bash
, можно использовать расширение фигурной скобки :
mv /etc/dir1/dir2/dir3/{a.out,b.out}
или даже
mv /etc/dir1/dir2/dir3/{a,b}.out
Во втором случае Вы могли использовать расширение фигурной скобки снова:
mv some{very,really}bigfilename.png
Или (хотя это действительно не сохраняет много ввода) Вы могли использовать расширение Bash истории следующим образом:
$ mv someverybigfilename.png !#$:s/very/really
mv someverybigfilename.png somereallybigfilename.png
или
cd /etc/dir1/dir2/dir3/
mv a.out b.out
или
делают сценарий как
#!/bin/bash
dir_Path="/etc/dir1/dir2/dir3/"
mv $dir_Path\a.out $dir_Path\b.out
exit
и переименовать:
#!/bin/bash
dir_Path="/etc/dir1/dir2/dir3/"
name_part="bigfile.png"
cd $dir_Path
mv some$name_part somereally$name_part
exit
Если путь является тем же, я не вижу оснований почему не ввод в папку.
Вы могли сохранить путь с pushd или возвратились с CD -
Пример:
luca@elite:~$ pushd dir1/dir2/dir3/
~/tmp/dir1/dir2/dir3 ~/tmp
luca@elite:~/dir1/dir2/dir3$ mv a.out b.out
luca@elite:~/dir1/dir2/dir3$ popd
~/tmp
luca@elite:~$
или
luca@elite:~$ cd dir1/dir2/dir3/
luca@elite:~/dir1/dir2/dir3$ mv b.out a.out
luca@elite:~/dir1/dir2/dir3$ cd -
luca@elite:~$
Об имени файла единственная вещь, которая прибыла по моему мнению, состоит в том, чтобы сохранить его в переменной..
Существует несколько способов приблизиться к этому. Можно было быть через функцию, определяемую в ~/.bashrc
файл.
pmv(){
mv "$1"/"$2" "$1"/"$3"
}
pmv
функция затем взяла бы 3 аргумента. Путь к каталогу, исходному файлу и целевому файлу. Например:
$ ls testdir
self_test.sh* test.wxg
$ pmv ./testdir test.wxg test2.wxg
$ ls testdir
self_test.sh* test2.wx
Заметьте, что в этой функции мы присоединяемся к пути к каталогу и пути к файлу с наклонной чертой, таким образом когда путь к каталогу дан как параметр командной строки, не должно быть запаздывающей наклонной черты в конце. Мы можем, однако, улучшить функциональное определение с помощью расширения параметра удара, которое затем позволит нам использовать также /path/to/dir
или /path/to/dir/
:
pmv(){
mv "${1%/}"/"$2" "${1%/}"/"$3"
}
По связанному вопросу (то, что я подозреваю, имеет то же решение). Скажите, что я хочу переместить файл someverybigfilename.png в somereallybigfilename.png. Существует ли способ выполнить это, не перепечатывая имя?
Эффективно, нет, нет никакого способа сделать это с mv
один. Даже steeldriver's и решения для шахты для первой части Вашего вопроса использует bash
функции, нет mv
. Более усовершенствованные манипуляции переименованием, такой как в Вашем тексте вставки случая в имя файла, должны быть, покончили prename
где Вы используете регулярные выражения жемчуга для динамичного переименования файлов.
$ touch someverybigfilename.png
$ prename 's/very/really/' someverybigfilename.png
$ ls somereallybigfilename.png
somereallybigfilename.png