Поэтому вам нужно что-то вроде этого:
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
Основная часть времени, затрачиваемого вашим циклом, вероятно, приходится на вызов вашего 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
после того, как убедитесь, что скрипт работает правильно.
Для первой части рассмотрим:
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.
Вы можете переименовывать все файлы параллельно. Внесите следующие тривиальные изменения в тот же медленный код, который вы указали в своем вопросе:следующим образом:
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
. Однако вы можете настроить все переменные по своему усмотрению.
Я люблю Perl one -вкладыши:
ls left-*.tiff | perl -ne 'if(m/(\S+)-(\d+).tiff/){chomp;printf "mv $_ left-%06d.tiff\n", $2}' | bash
PS, не забудьте дважды проверить вывод перед передачей в bash
. Просто чтобы быть в безопасности.