削除後の名前変更:同じファイル名別の拡張子

削除後の名前変更:同じファイル名別の拡張子

何千ものファイルを含むディレクトリがあり、各ファイルのコピーがあります。一例:

file1.txt
file1.jpg.txt

file2.txt
file2.jpg.txt

すべての*.txtファイルを削除し、*.jpg.txtを保持してから、すべての*.jpg.txtの名前を*.txtに変更したいと思います。

OpenSuse 12で実行しています。

答え1

@roaimaが述べたように、最初にファイルを削除する必要はなく、ファイルを移動すると古いファイルが自動的に上書きされます。

1つの方法は、bashでforループを使用することです。

for f in *.jpg.txt; do mv $f ${f/%.jpg.txt/.txt}; done

説明します。

  • for f in *.jpg.txt; do <command>; done:各ファイルに対してコマンドを実行します*.jpg.txt。ファイル名は実行中に変数に保存されますf
  • ${f/%.jpg.txt/.txt}:の値です$fが、最後の項目.jpg.txtはに置き換えられます.txt。バラよりhttps://www.tldp.org/LDP/abs/html/parameter-substitution.htmlこれについて詳しく学んでください。
  • mv $f ${f/%.jpg.txt/.txt}:古いファイルの名前を.jpg

このコードを実行する前に、次を実行してコードが正しく実行されていることを確認できます。

for f in *.jpg.txt; do echo $f ${f/%.jpg.txt/.txt}; done

これにより、移動するファイルのペアが印刷されます。

答え2

#!/bin/bash

## to remove ".txt" files

# this will keep the files which removing in txt
# you can see delete file on the script path
ls -lrth | grep ".txt" | grep -v "jpg" | awk -F' ' {'print $9'} > delete
terminal=`tty`
exec < ${delete=delete}
        while read line
        do
                rm -rf $line
        done
exec < $terminal


## Renaming the files
# this will keep the files which we are renaming
# you can see rename file on the script path
ls -lrth | grep -i "jpg" | awk -F' ' {'print $9'} > rename 
terminal=`tty`
exec < ${rename=rename}
        while read line
        do
                nn=`echo $line | sed 's/.jpg//gi'`
                mv $line $nn
        done
exec < $terminal

関連情報