Как получить полное имя файла в одну команду?
Как получить полное (с путём относительно / ) имя файла в одну команду? Бывает, работаешь в консоли, и нужно скопировать /полный/путь/к/файлу , например, чтобы в соседней консоли использовать его как аргумент для scp . Приходится вызывать pwd , чтобы скопировать путь к текущей папке, и ls , чтобы скопировать имя файла. Можно ли это сделать в одну команду?
Например, find ‘pwd’/имя_файла (кавычки вокруг pwd — обратные). Или ещё куча вариантов, например, с readlink , как указано в ответе ниже. Количество команд и/или аргументов при этом не имеет вообще никакого значения, ибо есть алиасы.
4 ответа 4
readlink -f покажет /полный/путь/к/файлу.ext , дополнительно «раскрыв» все символические ссылки и заменив их на «канонические» пути. Пример показателен:
$ cd /tmp $ mkdir foo $ touch foo/bar.ext $ ln -s foo/bar.ext baz.ext $ readlink -f foo/bar.ext /tmp/foo/bar.ext $ readlink -f baz.ext /tmp/foo/bar.ext
Здесь /tmp/baz.ext является симлинком на /tmp/foo/bar.ext .
Предложенное решение работает в Linux и FreeBSD, но не работает в Mac OS — у них там своя атмосфера.
Предложу вариант чуть понавороченней:
readlink -m файл | tr -d '\r\n' | xsel -b
- Читаем полный путь
- Сразу же копируем его в буфер обмена, предварительно .
- . вырезав конечные СR/LF (если не хотим, чтобы они добавлялись при вставке)
Для файлов относительно текущего каталога
можно, например, подставлять то, что содержится в переменной окружения $PWD (или в любой другой переменной окружения), даже без «команды», а всего лишь клавиатурным сочетанием. если, конечно, ваша оболочка использует gnu/readline для редактирования командной строки.
например, такая команда привяжет к клавиатурному сочетанию alt+o подстановку значения переменной $PWD (и слэша в конце — для удобства) в текущую позицию курсора:
здесь \eo — это и есть alt+o (а, например, \C-o — это ctrl+o ).
чтобы данная привязка создавалась автоматически в каждой сессии оболочки, можно добавить приведённую команду, например, в стартовый скрипт используемой оболочки — ~/.$rc .
а ещё лучше — добавить строку, которая в примере выше передавалась встроенной команде оболочки bind, прямо в файл ~/.inputrc (конф. файл, используемый gnu/readline-ом):
Различные действия с файлами расширениями в Bash скрипте
wget https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.2.0-linux-x86-64.tar.gz
mkdir webp
cp libwebp-1.2.0-linux-x86-64.tar.gz webp/
tar -xvf libwebp-1.2.0-linux-x86-64.tar.gz
cp -r libwebp-1.2.0-linux-x86-64 libwebp-current
cd libwebp-current/bin
pwd
vi ~/.bashrc
#!/bin/bash for file in ./**.jpg; do filename= » $ » newfile= $filename «.webp» cwebp -q 60 $file -o $newfile done
Добавить к названиям файлов суффикс
Если нужно сохранить расширение файла, а к оригинальному названию добавить какое-то слово или символ. А сделать это со всеми файлами данного типа в директории
Например в директории есть файлы a.jpg , b.jpg , c.jpg , а нужно сделать из них a—small.jpg , b—small.jpg , c—small.jpg
#!/bin/bash POSTFIX=»—small» # что вы хотите добавить EXT=».jpg» # к каким файлам for file in ./** $EXT ; do fullname= » $ » filename= » $ » temp= $filename $POSTFIX mv $file $$EXT done
А теперь скрипт, который делает и то и другое, а перед тем как делать проверяет нет ли уже такого файла
#!/bin/bash # # After this script is used all .jpg and .png images that did not have # —small. versions will get one # afterwards all .jpg and .png images will get their .webp version # including those —small version that were created by this script # # At the very end each image will have 4 versions: # original # postfixed # original .webp # postfixed .webp POSTFIX = » —small » DOT = » . » for file in ./*; do EXT = » $ » # echo $EXT if [[ $EXT = «jpg» ]] || [[ $EXT = «png» ]]; then # all images will without .webp version fullname = » $ » # echo $fullname filename = » $ » # echo $filename webp_file = $filename » .webp » if test -f » $webp_file «; then echo » $( date ‘ +%Y-%m-%d %H:%M:%S,%3N ‘ ) » ____ » \ $webp_file exists » >> image_proc.log else echo » $( date ‘ +%Y-%m-%d %H:%M:%S,%3N ‘ ) » ____ » \ Converting $file to $webp_file » >> image_proc.log cwebp -q 60 $file -o $webp_file # echo «no webp» fi # do not add postfix to files that already have one existing_postfix = » $ » if [[ $existing_postfix != » —small » ]]; then # check if this file already has prefixed version small_candidate = $filename$POSTFIX$DOT$EXT if test -f » $small_candidate «; then # file with a postfix already exists. # And its .webp version existed or was created # at previous step echo » $( date ‘ +%Y-%m-%d %H:%M:%S,%3N ‘ ) » ____ » \ $small_candidate already exists.\ No need to add $POSTFIX to $filename » >> image_proc.log else # create new file with prefix echo » $( date ‘ +%Y-%m-%d %H:%M:%S,%3N ‘ ) » ____ \ » Copy $file to $small_candidate » >> image_proc.log cp $file $small_candidate # check if its .webp version already exists webp_small_candidate = $filename$POSTFIX$DOT » webp » if test -f » $webp_small_candidate «; then echo » $( date ‘ +%Y-%m-%d %H:%M:%S,%3N ‘ ) » ____ » \ $webp_small_candidate already exists. » else echo » $( date ‘ +%Y-%m-%d %H:%M:%S,%3N ‘ ) » ____ » \ Converting $small_candidate to $webp_small_candidate » >> image_proc.log cwebp -q 60 $small_candidate -o $webp_small_candidate fi fi else # check if this file with postfix has a webp version echo » $( date ‘ +%Y-%m-%d %H:%M:%S,%3N ‘ ) » ____ » \ $filename :ignored — already has —small postfix » >> image_proc.log fi else echo $( date ‘ +%Y-%m-%d %H:%M:%S,%3N ‘ ) » ____ » \ $EXT » :ignored as it is not jpg or png » >> image_proc.log fi done #!/bin/bash # # After this script is used all .jpg and .png images that did not have # —small. versions will get one # afterwards all .jpg and .png images will get their .webp version # including those —small version that were created by this script # # At the very end each image will have 4 versions: # original # postfixed # original .webp # postfixed .webp POSTFIX=»—small» DOT=».» for file in ./*; do EXT=»$» # echo $EXT if [[ $EXT = «jpg» ]] || [[ $EXT = «png» ]]; then # all images will without .webp version fullname=»$» # echo $fullname filename=»$» # echo $filename webp_file=$filename».webp» if test -f «$webp_file»; then echo «$(date ‘+%Y-%m-%d %H:%M:%S,%3N’)» ____ «\ $webp_file exists» >> image_proc.log else echo «$(date ‘+%Y-%m-%d %H:%M:%S,%3N’)» ____ «\ Converting $file to $webp_file» >> image_proc.log cwebp -q 60 $file -o $webp_file # echo «no webp» fi # do not add postfix to files that already have one existing_postfix=»$» if [[ $existing_postfix != «—small» ]]; then # check if this file already has prefixed version small_candidate=$filename$POSTFIX$DOT$EXT if test -f «$small_candidate»; then # file with a postfix already exists. # And its .webp version existed or was created # at previous step echo «$(date ‘+%Y-%m-%d %H:%M:%S,%3N’)» ____ «\ $small_candidate already exists.\ No need to add $POSTFIX to $filename» >> image_proc.log else # create new file with prefix echo «$(date ‘+%Y-%m-%d %H:%M:%S,%3N’)» ____ \ «Copy $file to $small_candidate» >> image_proc.log cp $file $small_candidate # check if its .webp version already exists webp_small_candidate=$filename$POSTFIX$DOT»webp» if test -f «$webp_small_candidate»; then echo «$(date ‘+%Y-%m-%d %H:%M:%S,%3N’)» ____ «\ $webp_small_candidate already exists.» else echo «$(date ‘+%Y-%m-%d %H:%M:%S,%3N’)» ____ «\ Converting $small_candidate to $webp_small_candidate» >> image_proc.log cwebp -q 60 $small_candidate -o $webp_small_candidate fi fi else # check if this file with postfix has a webp version echo «$(date ‘+%Y-%m-%d %H:%M:%S,%3N’)» ____ «\ $filename :ignored — already has —small postfix» >> image_proc.log fi else echo $(date ‘+%Y-%m-%d %H:%M:%S,%3N’)» ____ «\ $EXT» :ignored as it is not jpg or png» >> image_proc.log fi done
Изменить расширение файлов
Допустим у вас есть картинки JPG и jpg а нужно, чтобы все были jpg
#!/bin/bash for file in ./*; do EXT = » $ » # echo $EXT if [[ $EXT = «JPG» ]]; then # all images will without .webp version fullname = » $ » # echo $fullname filename = » $ » # echo $filename jpg_file = $filename » .jpg » if test -f » $jpg_file «; then echo » $( date ‘ +%Y-%m-%d %H:%M:%S,%3N ‘ ) » ____ » \ $jpg_file exists » >> JPG_to_jpg.log else echo » $( date ‘ +%Y-%m-%d %H:%M:%S,%3N ‘ ) » ____ » \ Converting $file to $jpg_file » >> JPG_to_jpg.log mv $fullname $jpg_file # echo «no webp» fi fi done
Более читаемый вариант — старое и новое расширение задаются в начале скрипта.
#!/bin/bash OLD_EXT =PNG NEW_EXT =png LOG_FILE =case_change.log for file in ./*; do EXT = » $ » # echo $EXT if [[ $EXT = «$OLD_EXT» ]] ; then fullname = » $ » # echo $fullname filename = » $ » # echo $filename new_file = $filename » . $NEW_EXT » if test -f » $new_file «; then echo » $(date ‘ +%Y-%m-%d %H:%M:%S,%3N ‘ ) » ____ » \ $new_file exists » >> $LOG_FILE else echo » $(date ‘ +%Y-%m-%d %H:%M:%S,%3N ‘ ) » ____ » \ Converting $file to $new_file » >> $LOG_FILE mv $fullname $new_file fi fi done
Обрезать названия файлов с конца
Допустим у вас есть картинки jpg и png из названия которых нужно удалить суффикс —big
В этом скрипте будем проверять расширение не условием ИЛИ а на принадлежность к массиву
#!/bin/bash EXTENSIONS=(jpg png) REMOVABLE=»—big» DOT=».» for file in ./*; do EXT=»$» if [[ » $ » =~ » $ » ]]; then FILENAME=»$» fivelast=$ if [[ $fivelast = $REMOVABLE ]]; then mv «$file» «$» fi fi done