Переименовать подмножество файлов в каталоге

Поэтому вам нужно что-то вроде этого:

tree | sed 's/├\|─\|│\|└/ /g'

Это заменяет все символы "line" пробелами.


См:

$ tree
.
├── dir1
│   ├── file1
│   └── file2
└── dir2
    ├── file1
    └── file2

2 directories, 4 files
$ tree | sed 's/├\|─\|│\|└/ /g'
.
    dir1
        file1
        file2
    dir2
        file1
        file2

2 directories, 4 files
1
06.09.2018, 02:16
4 ответа

Основная часть времени, затрачиваемого вашим циклом, вероятно, приходится на вызов вашего zeropad.shскрипта.

Вместо этого сделайте все в одном скрипте:

#!/bin/bash

for filename in left-*.tiff; do
    if [[ "$filename" =~ ^left-0*([1-9]?[0-9]+)\.tiff$ ]]; then
        num=${BASH_REMATCH[1]}
        newname="left-$( printf '%06d' "$num" ).tiff"
        if [ "$filename" != "$newname" ] && [ ! -e "$newname" ]; then
            echo mv "$filename" "$newname"
        fi
    fi
done

Удалите echoпосле того, как убедитесь, что скрипт работает правильно.

3
27.01.2020, 23:10

Для первой части рассмотрим:

for i in left-?????.tiff left-????.tiff left-???.tiff left-??.tiff left-?.tiff...`

Если при этом создается слишком много файлов, разбейте их на разделы:

for i in left-?????.tiff...`

...

for i in left-????.tiff...`

...

В приведенном выше примере используется символ глобуса ?для замены любого одиночного символа, когда бы он ни появлялся. Здесь я специально запросил 5, 4, 3, 2, а затем 1 цифры после начального left-.

Для второй части один вариант:

dir=$(mktemp)
cd "$dir"
for i in $(seq 10); do touch $(printf 'left-%05d.tiff' $((RANDOM % 10000))); done

Настройте seq 10, чтобы создать большее или меньшее количество имен файлов. Настройте % 10000для получения меньших или больших чисел. Обратите внимание, что $RANDOM в bash генерирует числа от 0 до 32 767.

2
27.01.2020, 23:10

Вы можете переименовывать все файлы параллельно. Внесите следующие тривиальные изменения в тот же медленный код, который вы указали в своем вопросе:следующим образом:

cd data_folder  # cd the folder where you put the *.tiff files
for i in *.tiff;do 
{
mv $i `./zeropad.sh $i`;
}&

Это приведет к переименованию всех файлов одновременно. Имейте в виду, что на вашей рабочей станции должно быть достаточно ресурсов памяти, прежде чем запускать этот код в папке, содержащей файлы *.tiff. Нехватка ресурсов памяти может привести к сбою памяти. Но учитывая, что процесс только переименовывает файлы, все должно быть в порядке!

Для того, чтобы учесть ресурсы памяти на вашей рабочей станции. Сохраните следующий код в файле с именем code, дайте ему права доступа и запустите его:

mem=$(free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }' | grep Memory | awk '{print $3}' | tr -d "()%MB" | cut -d / -f 2  )

for i in *.tiff;do 
{
mv $i `./zeropad.sh $i`;
}&

if [ $mem -lt 100000 ] 
 then 
   if  (( "$i" % 75 == 0 ))
    then 
      sleep 4
   fi
 fi
if [ $mem -gt 100000 ] 
 then 
   if  (( "$i" % 300 == 0 ))
    then 
      sleep 3
   fi
 fi
done

Когда вы запустите code, он проверит ресурсы памяти на вашей рабочей станции, используя переменную mem. Если памяти меньше 100000MB, то сразу переименует 75 files. Если ресурсов памяти больше, чем 100000MB, то сразу будет переименовано до 300 files. Однако вы можете настроить все переменные по своему усмотрению.

1
27.01.2020, 23:10

Я люблю Perl one -вкладыши:

ls left-*.tiff | perl -ne 'if(m/(\S+)-(\d+).tiff/){chomp;printf "mv $_ left-%06d.tiff\n", $2}' | bash

PS, не забудьте дважды проверить вывод перед передачей в bash. Просто чтобы быть в безопасности.

1
27.01.2020, 23:10

Теги

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