Bash linux имя файла

How to only get file name with Linux ‘find’?

In GNU find you can use -printf parameter for that, e.g.:

find /dir1 -type f -printf "%f\n" 

@Urchin No reason it shouldn’t so long as you have correct logic (i.e. -o has lower precedence than implied -a , so you will often want to group your -o arguments)

I don’t think this is the right answer. find -printf «%f\n» -exec echo <> \; reveals that the original filename is passed forward

If your find doesn’t have a -printf option you can also use basename:

find ./dir1 -type f -exec basename <> \; 

Use -execdir which automatically holds the current file in <> , for example:

find . -type f -execdir echo '<>' ';' 

You can also use $PWD instead of . (on some systems it won’t produce an extra dot in the front).

If you still got an extra dot, alternatively you can run:

find . -type f -execdir basename '<>' ';' 

-execdir utility [argument . ] ;

The -execdir primary is identical to the -exec primary with the exception that utility will be executed from the directory that holds the current file.

When used + instead of ; , then <> is replaced with as many pathnames as possible for each invocation of utility. In other words, it’ll print all filenames in one line.

If you are using GNU find

Or you can use a programming language such as Ruby(1.9+)

If you fancy a bash (at least 4) solution

shopt -s globstar for file in **; do echo $; done 

If you want to run some action against the filename only, using basename can be tough.

find ~/clang+llvm-3.3/bin/ -type f -exec echo basename <> \; 

will just echo basename /my/found/path . Not what we want if we want to execute on the filename.

But you can then xargs the output. for example to kill the files in a dir based on names in another dir:

cd dirIwantToRMin; find ~/clang+llvm-3.3/bin/ -type f -exec basename <> \; | xargs rm 
find /dir1 -type f -exec basename <> \; 

As others have pointed out, you can combine find and basename , but by default the basename program will only operate on one path at a time, so the executable will have to be launched once for each path (using either find . -exec or find . | xargs -n 1 ), which may potentially be slow.

If you use the -a option on basename , then it can accept multiple filenames in a single invocation, which means that you can then use xargs without the -n 1 , to group the paths together into a far smaller number of invocations of basename , which should be more efficient.

find /dir1 -type f -print0 | xargs -0 basename -a 

Here I’ve included the -print0 and -0 (which should be used together), in order to cope with any whitespace inside the names of files and directories.

Here is a timing comparison, between the xargs basename -a and xargs -n1 basename versions. (For sake of a like-with-like comparison, the timings reported here are after an initial dummy run, so that they are both done after the file metadata has already been copied to I/O cache.) I have piped the output to cksum in both cases, just to demonstrate that the output is independent of the method used.

$ time sh -c 'find /usr/lib -type f -print0 | xargs -0 basename -a | cksum' 2532163462 546663 real 0m0.063s user 0m0.058s sys 0m0.040s $ time sh -c 'find /usr/lib -type f -print0 | xargs -0 -n 1 basename | cksum' 2532163462 546663 real 0m14.504s user 0m12.474s sys 0m3.109s 

As you can see, it really is substantially faster to avoid launching basename every time.

Читайте также:  Узнать систему компьютера linux

Источник

Различные действия с файлами расширениями в 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

Читайте также:  Восстановить флешку linux mint

Изменить расширение файлов

Допустим у вас есть картинки 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

Читайте также:  Ввести linux домен windows

Источник

Как получить полное имя файла в одну команду?

Как получить полное (с путём относительно / ) имя файла в одну команду? Бывает, работаешь в консоли, и нужно скопировать /полный/путь/к/файлу , например, чтобы в соседней консоли использовать его как аргумент для 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 
  1. Читаем полный путь
  2. Сразу же копируем его в буфер обмена, предварительно .
  3. . вырезав конечные СR/LF (если не хотим, чтобы они добавлялись при вставке)

Для файлов относительно текущего каталога

можно, например, подставлять то, что содержится в переменной окружения $PWD (или в любой другой переменной окружения), даже без «команды», а всего лишь клавиатурным сочетанием. если, конечно, ваша оболочка использует gnu/readline для редактирования командной строки.

например, такая команда привяжет к клавиатурному сочетанию alt+o подстановку значения переменной $PWD (и слэша в конце — для удобства) в текущую позицию курсора:

здесь \eo — это и есть alt+o (а, например, \C-o — это ctrl+o ).

чтобы данная привязка создавалась автоматически в каждой сессии оболочки, можно добавить приведённую команду, например, в стартовый скрипт используемой оболочки — ~/.$rc .

а ещё лучше — добавить строку, которая в примере выше передавалась встроенной команде оболочки bind, прямо в файл ~/.inputrc (конф. файл, используемый gnu/readline-ом):

Источник

Оцените статью
Adblock
detector