3

次のようなディレクトリがあります。

pages/
    folder1/
        folder1.filename1.txt
        folder1.filename2.txt
    folder2/
        folder2.filename4.txt
        folder2.filename5.txt
    folder3/
        filename6.txt

私はそれを次のようにしたい:

pages/
    folder1/
        filename1.txt
        filename2.txt
    folder2/
        filename3.txt
        filename4.txt
    folder3/
        filename5.txt

次をls * | sed -e s/^[^.]*.// > /tmp/filenames.txt含むファイルを取得します。

filename1.txt
filename2.txt
filename3.txt
filename4.txt
txt

フォームのファイル名を無視し、フォームの[filename].[suffix]ファイル名のみを調べるようにsedに指示するにはどうすればよい[foldername].[filename].[suffix]ですか?

最後のスクリプト (指摘したように、find コマンドは物事を単純化しますが、これはうまくいきました):

for folder in $(ls .)
do
    if test -d $folder
    then
        pushd $folder
                ls * | sed 's/.*\.\(.*\..*\)/\1/' > /tmp/filenames.txt
                ls * > /tmp/current.txt

                exec 3</tmp/current.txt
                exec 4</tmp/filenames.txt

                while read file <&3; read name <&4;
                do
                    mv "$file" "$name"
                done

                rm /tmp/current.txt
                rm /tmp/filenames.txt
        popd
    else
        echo $folder "not a directory"
    fi
done

exit 0

このページは現在、コミュニティ wiki です。以下に、よりエレガントなソリューションを追加できます。

for folder in $(ls .)
do 
     something better
4

3 に答える 3

3

これを試してください:

sed 's/.*\.\(.*\..*\)/\1/'

本当に使用するfind必要があり、「-dフォルダー」、一時ファイル、exec、またはwhileループのチェックは必要ありません。

プロセス置換を使用して、一時ファイルを回避できます。

while read line
do
    echo $line
done < <(ls)

rename興味深いもう 1 つの項目: システムには、またはprename正規表現を使用してファイルの名前を変更するという Perl スクリプトが既にある場合があります。

于 2009-11-16T12:00:50.657 に答える
2

使用する必要はありませんsed:

ls * > /tmp/current.txt
exec 3</tmp/current.txt
while read file <&3;
do
    replacement=${file#${folder}.}
    if [ "$replacement" != "txt" ] ; then
        mv "$file" "$replacement"
    fi
done
于 2009-11-16T12:04:19.073 に答える
0

次の正規表現を使用します。

/\A(.\*?\\.){2,2}.+\Z/
于 2009-11-16T11:44:25.450 に答える