с mv, рассмотрите путь / имя исходного файла при выборе адресата [duplicate]

Этот вопрос уже имеет ответ здесь: Файл с командной строкой с длинным пути к каталогу без повторения пути к каталогу 5 ответов

Скажем, мне нужно переместить файл /etc/dir1/dir2/dir3/a.out в /etc/dir1/dir2/dir3/b.out

Ввод всего пути дважды утомительно, и переход в каталог может быть не идеальным. Есть ли способ сделать такой шаг, не переустанавливая каталог?

По связанному вопросу (который, как я подозреваю, имеет то же решение). Скажем, я хочу переместить файл someverybigfilename.png в somereallybigfilename.png. Есть ли способ сделать это, не переименовывая имя?

(Я знаю, что могу использовать скрипт, но mv поддерживает некоторую такую ​​вещь изначально?)

Короче: как я могу использовать переход, чтобы частично изменить / изменить только часть имени файла? Как сделать небольшое изменение, например расширение?

1
задан 23 March 2017 в 22:37

3 ответа

либо

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
2
ответ дан 23 May 2018 в 00:22

Если путь один и тот же, я не вижу причины, по которым вы не входите в папку.

Вы можете сохранить путь с помощью 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:~$ 

О имени файла единственное, что пришло мне в голову, это сохранить его в переменной ..

2
ответ дан 23 May 2018 в 00:22

Есть несколько способов приблизиться к этому. Можно выполнить функцию, определенную в файле ~/.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

Обратите внимание, что в этой функции мы присоединяем путь к каталогу и путь к файлу с косой чертой, поэтому, когда путь к каталогу задается как аргумент командной строки, не должно быть конечной косой черты в конец. Тем не менее, мы можем улучшить определение функции, используя расширение параметра bash, которое позволит нам использовать либо /path/to/dir, либо /path/to/dir/:

pmv(){
    mv "${1%/}"/"$2" "${1%/}"/"$3"
}
вопрос (который, как я подозреваю, имеет то же решение). Скажем, я хочу переместить файл someverybigfilename.png в somereallybigfilename.png. Есть ли способ сделать это, не переименовывая имя?

Эффективно, нет, нет способа сделать это с помощью mv. Даже решения для steeldriver и моих решений для первой части вашего вопроса используют функции bash, а не mv. Более совершенные манипуляции с переименованием, например, в вашем случае с вставкой текста в имя файла, должны выполняться с помощью prename, где вы используете регулярные выражения perl для динамического переименования файлов.

$ touch someverybigfilename.png

$ prename 's/very/really/' someverybigfilename.png                                                                       

$ ls somereallybigfilename.png                                                                                           
somereallybigfilename.png
1
ответ дан 23 May 2018 в 00:22

Другие вопросы по тегам:

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