Переименовывая несколько Файлов, Сценария Bash, предпочтительно с Дополнением

Острота Perl для задания:

perl -nle 'print s/(^|[^,]),,([^,]|$)/$&/g' your_file

Или, еще короче, с awk:

 awk -F',,' '{print NF-1}' your_file

awk можно было бы рассмотреть ,,,, быть двумя случаями ,,, в то время как perl нельзя было бы считать его вообще. Выберите тот, который удовлетворяет Вашему варианту использования.

Обновление

Из Вашего комментария кажется, что Ваше исходное намерение состояло в том, чтобы считать количество пустых полей на каждой строке. Если это так, эта острота Perl должна помочь (она предполагает, что нет никаких заключенных в кавычки полей, содержащих запятые):

perl -nle 'print scalar grep {//} split/,/' your_file

То же в awk если Perl не доступен:

awk -F, 'empty=0;{for(i=1;i<=NF;i++)if($i=="")empty++};{print empty}' your_file

2
02.03.2015, 16:35
3 ответа

Если нет расширения в файлах Имя:

for i in secondfolder/IM_* ; do mv "$i" "${i%_[0-9]*}_$[10#${i##*_}+2048]" ; done
2
27.01.2020, 22:05

Простой способ в Bash :

for i in $(ls /path/to/your-directory); do
name=$(echo "$i" | cut -d '_' -f1)
num=$(echo "$i" | cut -d'_' -f2)
num1=$(( num + 2048 ))
mv "$i" "${name}_$num1"
done
1
27.01.2020, 22:05

Здесь мы должны передать имя файла дважды в функции.

Это не совсем то же самое, что вы заметили, заметив, что один из них используется в качестве значения argv [0] . Это не обязательно должно совпадать с базовым именем исполняемого файла; многие/большинство вещей игнорируют это, и вы можете поместить туда все, что хотите.

Первый - это фактический путь к исполняемому файлу, для которого существует очевидная необходимость. Второй передается процессу якобы в качестве имени, используемого для его вызова, но, например,

execl("/bin/ls", "banana", "-l", NULL);

Будет работать нормально, предполагая, что /bin/ls является правильным путем.

Однако в некоторых приложениях используется argv [0] . Обычно они имеют одну или несколько символьных ссылок в $ PATH ; это характерно для утилит сжатия (иногда вместо них используются оболочки). Если установлен xz , stat $ (который xzcat) показывает, что это ссылка на xz , и man xzcat совпадает с man xz , что объясняет «xzcat эквивалентен xz --decompress --stdout». Способ xz может сказать, как он был вызван, проверяя argv [0] , делая следующие эквиваленты:

execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);
-121--39912-

Вы можете использовать копию bash...
Я имею в виду, что вы можете сделать отдельную версию bash в одном из ваших каталогов $ PATH , и назвать его bash1 или что-то вроде того.
Тогда, что вы можете сделать, это дать ему другие разрешения, чтобы вы могли запустить glassfish с bash1 вместо bash.
Это означает, что tyat bash останется неизменным, и у вас будет собственная версия bash с отдельными разрешениями для экземпляров, таких как glassfish . Единственный недостаток в том, что это будет означать, что вам придется регулировать это только для определенных программ и пользователей или вся система может быть подорвана...

-121--186185-

Здесь основной способ сделать что-то подобное с помощью сценария оболочки и awk.

Этот пример сценария является достаточно явным для вашего конкретного случая, его использование второго поля в имени файла является допустимым целым числом. И надеется, что в именах файлов нет случайных подчеркиваний. Более общий сценарий подтверждает, что поле 2 является просто числами, и делает разделитель полей параметром. Также предполагается, что нет расширения файла (например, .img или .png)

#!/bin/sh
WORKDIR=/(Directory where the files to be renamed are)
NUM2ADD=2048
cd $WORKDIR
echo "Old File    New File"
ls IM_* | while read i
do
   newfile=`echo $i | awk -F_ -v incby=$NUM2ADD '{t=$2 + incby;printf "IM_%s",t;}'`
   echo   $i    $newfile
   # after a dry run to test, replace 'echo' with 'mv' onces your sure of the result. 
done

Поскольку наличие расширения файла вполне вероятно, можно изменить строку awk на:

newfile=`echo $i | awk -F[_.] -v incby=$NUM2ADD '{t=$2 + incby; printf "IM_%s.%s",t,$3;}'` 

Это сохраняет расширение файла и использует _ подчеркивания и точку в качестве разделителей полей.

0
27.01.2020, 22:05

Теги

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