web-dev-qa-db-ja.com

ファイル名変更bashスクリプトの自動化

ドライブには、.odt拡張子の付いたドキュメントがたくさんあります。例: enter image description here

ただし、多くのドキュメントを閲覧すると、.odtが邪魔になります。

それで、私はこのスクリプト(removeODT.sh)をなんとか書きました:

#!/bin/bash

for file in *.odt
do
 mv "$file" "${file%.odt}"
done

これにより、スクリプトを実行するディレクトリ内の.odtファイルから.odt拡張子が削除されます。

例えば〜/ Desktop/MyDocumentsでターミナルを開き、入力します

sh /home/user1/BashScripts/removeODT.sh

これにより、MyDocumentsのすべてのファイルから.odt拡張子が削除されます。

しかし、拡張子を削除した後、他のオペレーティングシステムでファイルを使用できず、loookを使用してドキュメントの内容を検索することもできません。

そのため、必要に応じて.odt拡張子を追加する2番目のスクリプト(addODT.sh)を作成しました。

#!/bin/bash

for file in *
do
 mv "$file" "${file%}.odt"
done

今、私がしたいのは、これらのスクリプトが、現在のように単一のディレクトリだけでなく、指定された親ディレクトリとそのすべてのサブディレクトリ内のすべてのドキュメントを変更することです。

例えば「ドキュメントとそのすべてのサブフォルダー内のファイルから.odt拡張子を削除する」

これにより、フォルダごとにスクリプトを個別に実行しなくても、単一のスクリプトですべてのファイルを変更できます。しかし、私はこれにかなり慣れていないので、どうやってそれを行えばいいのか分かりません。

追伸理想的な解決策は、Nautilusで.odt拡張子を非表示にすることですが、私が知る限りそれは不可能です。

2
Rtsne42

findを使用して、ディレクトリを再帰的にウォークできます。

find -type f -exec mv {} {}.odt \;

拡張機能を削除すると、さらに問題が発生します。

find -name '*.odt' -exec bash -c 'f={}; mv "$f" "${f%.odt}"' \;

ただし、スクリプトを作成して拡張機能を削除し、findから呼び出して簡単にすることもできます。

find -name '*.odt' -exec remove_odt.sh {} \;

ご想像のとおり、{}は各ファイルの名前でexecに置き換えられ、最後の\;は実行するコマンドの終了位置を示します。

また、shを使用してbashスクリプトを実行しないでください。shbashは異なる獣です。

7
choroba