3

というタイトルのファイルがたくさんあるディレクトリがあります(たとえば)

how it is:            how it should be:
945TITLE-1.txt        945TITLE-00.txt
945TITLE-10.txt       945TITLE-01.txt
945TITLE-2.txt        945TITLE-02.txt
945TITLE-23.txt       945TITLE-03.txt
945TITLE-3.txt        945TITLE-10.txt
945TITLE.txt          945TITLE-23.txt

ダッシュ文字に続く数字とテキストは変更される可能性があるため、可変にする必要があります。番号のないファイル (この例では 945TITLE.txt) を無視して、次の行を使用して、ダッシュと 1 桁で終わるすべてのファイルを取得しています。

file=`ls -1 working/pages/files | grep [-][0-9].txt`

しかし、ダッシュと数字の間の 0 をスプライスする方法がわかりません。

for file in $filelist
do  
????
done

何度か試みた後、私はこれでさらに進んだ:

for file in working/pages/files/$filelist
do  
f1=${filelist%%[-]*}
f2=${filelist##*[-]}
finalName=${f1}-0${f2}
echo $finalName
mv $file working/pages/files/$finalName
done

の出力$finalName945TITLE-03.txt毎回であり、mvコマンドをにのみ適用し945TITLE-1.txt(誤ってに変更し945TITLE-03.txtます)、他のファイルが見つからないと言います(working/pages/files/最初のファイルのフォルダーのみを検索したため)

どんな助けでも大歓迎です.私は決してこの解決策と結婚していません. ありがとうございました

4

4 に答える 4

0

これは、あなたが始めたものに基づいて、私がここで作成した簡単な例です。あなたのケースを処理するためのいくつかの面白い特別なケーシングがあります945TITLE.txt

#!/bin/bash

for file in 945*
do
    suffix=${file##*[.]}
    base=$(basename ${file} .${suffix})
    prefix=${base%%[-]*}
    number=${base##*[-]}
    case ${number} in
        ''|*[!0-9]*) number=0 ;;
    esac
    echo ${prefix}-$(printf "%02d" ${number}).${suffix}
done
于 2013-01-30T19:40:46.990 に答える
0

考え :

  1. 行ごとに処理する (例 945TITLE-1.txt)
  2. 最初に「-」で分割します (これにより、「945TITLE」と「1.txt」が得られます)。
  3. 次に、最初の分割の 2 番目の出力を "." で分割します。(「1」と「txt」を与える)

    ls -1 | awk '{ 
             n=split($0, array , "-");
             if( n > 1 ) {
               printf("%s-",array[1]);
               split(array[2],arraydot,".");
               printf("%02d.%s\n", arraydot[1], arraydot[2]);
              } else {
               split(array[1],arraydot, "."); 
               printf("%s-00.%s\n",arraydot[1],arraydot[2]);
             }
          }' | sort
    

    上記の Else 条件は、945TITLE.txt

于 2013-01-30T20:24:14.117 に答える
0

この awk-onliner は機能します: (|sh生成された mv コマンドを確認するために、最初にエンディングを削除できます。)

ls -[your options] |awk  -F'-|\\.' 'NF<3{x=$0;sub(/\./,"-00.",x)}NF>2{x=sprintf ("%s-%02d.%s",$1,$2,$3)}{print "mv "$0" "x}' |sh

テキストファイルでシミュレートします。

kent$  cat test.txt
945TITLE-1.txt
945TITLE-10.txt
945TITLE-2.txt
945TITLE-23.txt
945TITLE-3.txt
945TITLE.txt

kent$  awk  -F'-|\\.' 'NF<3{x=$0;sub(/\./,"-00.",x)}NF>2{x=sprintf ("%s-%02d.%s",$1,$2,$3)}{print "mv "$0" "x}' test.txt
mv 945TITLE-1.txt 945TITLE-01.txt
mv 945TITLE-10.txt 945TITLE-10.txt
mv 945TITLE-2.txt 945TITLE-02.txt
mv 945TITLE-23.txt 945TITLE-23.txt
mv 945TITLE-3.txt 945TITLE-03.txt
mv 945TITLE.txt 945TITLE-00.txt

結果をshにパイプすると、awk.....|shmvコマンドが実行されるようになります。

于 2013-01-30T20:42:40.723 に答える
0

これはあなたのために働くことができるPerlの例です:

perl -E 'while(<*.txt>){ $a = $_; s/-\K\d\./0$&/ || s/\D\K\./-00./; rename $a, $_; }'

テストされていません。;-)

于 2013-01-30T20:59:35.310 に答える