Bash - добавление 0 в середине имени файла - PullRequest
2 голосов
/ 09 марта 2011

У меня есть набор файлов с именами:

mem0.csv
mem1.csv
.
.
.
.
mem153.csv
.
.
.

Они все в одной папке.Когда я делаю ls в папке, они появляются в порядке

mem0.csv
mem1.csv
mem10.csv
mem100.csv
.
.
.
mem2.csv
mem20.csv
.
.
.

Я хочу создать bash-скрипт для вставки 0 между mem и числом.Я полагаю, что мне нужно добавить 0, пока все имена файлов не будут одинаковой длины, единственная проблема в том, что я не знаю, как это сделать.

Ответы [ 4 ]

4 голосов
/ 09 марта 2011

ls, предоставляемый GNU coreutils, поддерживает версию сортировки :

$ ls -v
mem0.csv
mem1.csv
mem2.csv
...
mem10.csv
...
3 голосов
/ 09 марта 2011

Вы можете использовать инструмент printf, просто убедитесь, что он есть в вашей системе (он есть почти во всех современных системах) Чтобы переименовать их всех:

for i in {1..153}; do
    mv mem$i.csv mem`printf "%03d" $i`.csv
done

редактировать: Для случайного числа файлов код должен выглядеть примерно так:

dir = "/somedir"
fn = $(ls -l $dir | wc -l)
z = 0;
c = $fn
# Count the number of zero's to use
while [ $c -gt 0 ]; do
    (( $z++ ))
    c = $(( $c / 10 ))
done
# Rename the files
while [ $fn -gt 0 ]; do
    mv ${dir}/mem$fn.csv ${dir}/mem$(printf "%0${z}d" $i).csv
    (( $fn-- ))
done
1 голос
/ 10 марта 2011

Я думаю, что ls -v (как отмечено @ephemient) делает то, что вы хотите, но если вам действительно нужно заполнить числа нулями, вот быстрый и грязный способ, основанный на предоставленном шаблоне имени файла

last=$(ls -v *.csv | tail -n1) # last file has the biggest number
let max=${#last}-7 # minus the number of all the other chars (constant)

# below grep gets only the number part and head ignores the last line
# which we don't need to change 
ls -v mem*.csv | egrep -o '[0-9]+' | head -n -1 | \
while read n; do
    mv -ivf mem$n.csv mem$(printf "%0"$max"d" $n).csv
done
0 голосов
/ 09 марта 2011

OK.Вот как я это сделал.Я знаю, что это не правильно, но в этом случае есть шанс, что я пойму материал

#Cleaning the dest folder
cd "out"
rm *
cd ".."

#setting some variables
MAXLEN=-1

#Searching for the longest file name
for f in mem*.csv; do
   LEN=${#f}
   if [  $MAXLEN -lt $LEN  ]; then
      let MAXLEN=$LEN
   fi
done

for f in mem*.csv; do
   LEN=${#f}
   let LEN+=1
   COUNT="0" 
   until [ $MAXLEN  -lt $LEN  ]; do #Creating 0's string to add
      COUNT=$COUNT"0"
      let LEN+=1
   done
      CLEN=${#COUNT} #The string has one 0 more than it should have. We take that into an account
      let CLEN-=1
      echo $CLEN
      if [  $CLEN != 0  ]; then
         COUNT=${COUNT:0:$CLEN} #The string is to long, remove the last 0
         number=$(echo $f | tr -cd '[[:digit:]]') #Extracting the number from the rest of the file name
         cp $f "out/mem"$COUNT$number".csv" #creating the new file

 else
         cp $f "out/"$f
      fi
done


ls "out/"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...