検索と名前変更を使用して、すべてのファイルとフォルダにカスタム文字列を繰り返し追加します。
ディレクトリとすべてのサブディレクトリのすべてのエントリに「x」(引用符を除く)を追加したいと思います。私はmacOS Mojave 10.14.6とターミナルを使った初心者です。ダウンロードしました名前を変更するこれにはHomebrewを使用してください。
例:
/Old Project
/Old Project/Abstract.rtf
/Old Project/Manuscript.docx
/Old Project/Data Analysis
/Old Project/Data Analysis/Working Syntax.sps
/Old Project/Data Analysis/Working Data.sav
/Old Project/Data Analysis/Cleaned Data.sav
/Old Project/Data Analysis/Figures
/Old Project/Data Analysis/Figures/Figure 1.png
/Old Project/Data Analysis/Figures/Figure 2.png
/Old Project/Data Analysis/Raw Data
/Old Project/Data Analysis/Raw Data/2020-06-26.csv
/Old Project/Ethics
/Old Project/Ethics/Application.pdf
/Old Project/Ethics/Approval.pdf
/Old Project/Ethics/Informed Consent.docx
望ましい結果:
/x Old Project
/x Old Project/x Abstract.rtf
/x Old Project/x Manuscript.docx
/x Old Project/x Data Analysis
/x Old Project/x Data Analysis/x Working Syntax.sps
/x Old Project/x Data Analysis/x Working Data.sav
/x Old Project/x Data Analysis/x Cleaned Data.sav
/x Old Project/x Data Analysis/x Figures
/x Old Project/x Data Analysis/x Figures/x Figure 1.png
/x Old Project/x Data Analysis/x Figures/x Figure 2.png
/x Old Project/x Data Analysis/x Raw Data
/x Old Project/x Data Analysis/x Raw Data/x 2020-06-26.csv
/x Old Project/x Ethics
/x Old Project/x Ethics/x Application.pdf
/x Old Project/x Ethics/x Approval.pdf
/x Old Project/x Ethics/x Informed Consent.docx
私が今まで持っているもの:
find . -depth (-execdir OR -exec) rename -n ’s/^/x /‘ {} +
find .
現在の作業ディレクトリ内のすべてのファイルとディレクトリを繰り返し一覧表示します。パスを含むファイル名の一覧が出力されます。
-depth
パスが存在しなくなったため、名前が変更されたディレクトリで名前が変更されていないファイルが見つからないという問題が発生しないように、findに最下位の深さ(サブディレクトリの下部)から開始するように指示します。 (サブディレクトリを操作するためにこの検索と名前変更コマンドをどのように使用できますか?)
-exec
検索は、リスト内の各項目に対して命名コマンド(名前の変更)を実行します。
-execdir
Findは、リスト内の各項目に対して名前付きコマンド(名前の変更)を実行します。ただし、1つの違いは最初に各サブディレクトリに移動し、次に名前変更コマンドにファイル名のみを渡します(パスなし)。
rename
Perl正規表現を使用してコマンドの名前を変更します。再帰的なファイル名の変更はそれ自体で処理できないため、findが必要です。明らかに、これはいくつかのシステムでは標準コマンドであり、他の rename コマンドは他のシステムでは標準コマンドなので、少し混乱を招く。
-n
実際に実行するのではなく、何が起こるかを示すために名前の変更が表示されます。
’s///‘
最初の部分を 2 番目の部分に置き換えて、置換を実行するように名前を変更するように指示します。私の構文(’s/^/x /‘
)で^(ファイル名の先頭のトークン)をxに置き換えます。
{}
検索しているファイルのリストに直接名前を変更します。
+
find コマンドを終了するよう指示します。
-exec
比較的-execdir
-exec
フルファイルパスを渡します。名前の変更は、名前の変更文書と同様の質問に対する回答で説明されているように、フルファイルパスで機能します。
「名前の変更は、ファイル名だけでなくフルパスにも適用されます」(http://plasmaturm.org/code/rename/)
「中間の注意:問題があります。名前変更モードは>パスを含むファイル名を処理しません。問題を解決しようとしています。」 (https://unix.stackexchange.com/a/153489)
したがって、 を使用すると、-exec
「/Old Project/Data Analysis/Figures/x Figure 1.png」の代わりに「x /Old Project/Data Analysis/Figures/Figure 1.png」が表示されます。この問題を解決するには、同様の質問に対する回答で説明されているように、何らかの形でファイル名の部分をキャプチャする複雑な正規表現を作成する必要があると思います。
「最後のコンポーネントのみを変更したい場合は、正規表現を に固定して、
(\A|?<=/)
どの/とも一致せず、最後の/のみが一致することを確認できます。」https://unix.stackexchange.com/a/166886)
私はこの答えに与えられた正規表現を試しましたが、エラーが発生しました(「Quantierが正規表現のどんなエントリにも従わない...」)、実際に動作するかどうかわかりません。名前が変更されたバージョンの 。
execdir
ファイル名だけを渡すと有望です。実際にコマンドをテストしてみると、計画されたすべての変更が完璧に見えました。しかし、実際の結果はそうではありませんでした。ホームディレクトリのファイルとフォルダの名前を変更しましたが、他のすべてのファイルとフォルダを見つけることができませんでした。存在しないそうです。
ついに次の答えが見つかりました。
"find -execdir |名前の変更
相対パスの狂乱でなかった場合、これは基本名にのみ作用するPerl正規表現fuを避けるため、最善のアプローチになります。
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find a -depth -execdir rename 's/(.*)/\L$1/' '{}' \;
-execdir まず、ディレクトリに CD を挿入し、デフォルト名でのみ実行します。残念ながら、PATHハッキング部分を削除することはできません。 find -execdirは、PATHに相対パスがある場合は何も拒否します...」(ディレクトリ下のすべてのディレクトリを小文字に変更)
したがって、私が理解しているように、このコマンドは理論的には機能するため、テスト実行では機能しますが、実際には名前find
変更コマンドを実行するために実際に各サブディレクトリに移動することを拒否します。
私の質問:
- 目的
exec
: 名前を変更するために、ファイル全体のパスからファイル名を分離する方法はありますか? - 使用法
execdir
: find に絶対パス名の使用またはインポートを要求する方法はありますか?
ノート
私はプログラミングに初めて触れました。
私はこれが非常に徹底的な答えを見つけました(https://stackoverflow.com/a/54163971/13821837) しかし、構文が私のシステムで動作するものと一致しません。
答え1
使用ゲヌツール:
初めてインストール牛に似た一種の栄養 find
渡す
brew install findutils
それから:
gfind . -depth -exec rename -n 's@(?<=/)[\s\w\.-]+$@x $&@' {} \;
名前を変更してperl
。
-n
出力が良くなったらスイッチを取り外します。
ノート
-depth
ここで非常に重要なのは、ディレクトリ自体の名前を変更する前にディレクトリの最初のファイルを確認することです。 (降順、ここでは必須)。- で
-n
表しますrename
試運転
確認する正規表現の説明。
代替部分は、x $&
リテラルx
+space
と置換部分の左側の最後の完全一致を表します。s///
ローカルテスト:
./Old Project
./Old Project/Manuscript.docx
./Old Project/Data Analysis
./Old Project/Data Analysis/Working Syntax.sps
./Old Project/Data Analysis/Raw data
./Old Project/Data Analysis/Working Data.sav
./Old Project/Data Analysis/Figures
./Old Project/Data Analysis/Figures/Figure 2.png
./Old Project/Data Analysis/Figures/Figure 1.png
./Old Project/Data Analysis/Raw Data
./Old Project/Data Analysis/Raw Data/2020-06-26.csv
./Old Project/Data Analysis/Cleaned Data.sav
./Old Project/Ethics
./Old Project/Ethics/Informed Consent.docx
./Old Project/Ethics/Application.pdf
./Old Project/Ethics/Approval.pdf
./Old Project/Abstract.rtf
処理後:
./x Old Project
./x Old Project/x Manuscript.docx
./x Old Project/x Data Analysis
./x Old Project/x Data Analysis/x Cleaned Data.sav
./x Old Project/x Data Analysis/x Figures
./x Old Project/x Data Analysis/x Figures/x Figure 2.png
./x Old Project/x Data Analysis/x Figures/x Figure 1.png
./x Old Project/x Data Analysis/x Raw Data
./x Old Project/x Data Analysis/x Raw Data/x 2020-06-26.csv
./x Old Project/x Data Analysis/x Raw data
./x Old Project/x Data Analysis/x Working Data.sav
./x Old Project/x Data Analysis/x Working Syntax.sps
./x Old Project/x Ethics
./x Old Project/x Ethics/x Application.pdf
./x Old Project/x Ethics/x Approval.pdf
./x Old Project/x Ethics/x Informed Consent.docx
./x Old Project/x Abstract.rtf