ファイル名を自分のパスの連結にするために再帰的にファイルの名前変更 -- python フィールド と node.js フィールド と bash フィールド 関連 問題

Renaming files recursively to make the filename a concatenation of their path












1
vote

問題

日本語

タイトルが不明な場合は申し訳ありません。理解するのに役立つフォルダ構造の例:

<事前> <コード> /images/icons/654/323/64/64/icon.png /images/icons/837/283/64/64/icon.png

に改名される <事前> <コード> /images-icons-654-323-64-64-icon.png /images-icons-837-283-64-64-icon.png

私はBashが素晴らしくないので、私が始めなければならないのは:

<事前> <コード> find . -name "*.png"

これは私が -exec rename を使って、または何でもの使用を望んでいます。また、任意の言語を使って仕事を行うために開く!

英語

Sorry if the title is unclear. An example folder structure to help understand:

/images/icons/654/323/64/64/icon.png /images/icons/837/283/64/64/icon.png 

to be renamed to

/images-icons-654-323-64-64-icon.png /images-icons-837-283-64-64-icon.png 

I'm not great at bash so all I have to start with is:

find . -name "*.png" 

which will find all of the files, which I then am hoping to using -exec rename with, or whatever works. also open to using any language to get the job done!

</div
        
 
 

回答リスト

1
 
vote
vote
ベストアンサー
 

Pythonでは、そのようにすることができます:

<事前> <コード> import fnmatch import os def find(base_dir, some_string): matches = [] for root, dirnames, filenames in os.walk(base_dir): for filename in fnmatch.filter(filenames, some_string): matches.append(os.path.join(root, filename)) return matches files = find('.', '*.png') new_files = ['-'.join(ele.split('/')[1:]) for ele in files] for idx, ele in enumerate(files): os.rename(ele, new_files[idx])

そして適切なクレジットを与えるために、 find function私はこの答え。< / P>

 

In python you could do it like so:

import fnmatch import os  def find(base_dir, some_string):     matches = []     for root, dirnames, filenames in os.walk(base_dir):         for filename in fnmatch.filter(filenames, some_string):             matches.append(os.path.join(root, filename))      return matches  files = find('.', '*.png') new_files = ['-'.join(ele.split('/')[1:]) for ele in files]  for idx, ele in enumerate(files):     os.rename(ele, new_files[idx]) 

And to give proper credit, the find function I took from this answer.

</div
 
 
2
 
vote

BASHの溶液:

<事前> <コード> for f in $(find images_dir -type f); do mv -v "$f" ${f////-} done

これは 99887767 ディレクトリにあるすべてのファイルを見つけ、パラメータ展開、ファイルを新しいパスに移動します。

たとえば、ファイル try { NetworkController.getInstance().getRequestQueue().getCache().get(getJockyID_URL); }catch (Exception e){ e.printStackTrace(); } 0 try { NetworkController.getInstance().getRequestQueue().getCache().get(getJockyID_URL); }catch (Exception e){ e.printStackTrace(); } 1 に移動します。

try { NetworkController.getInstance().getRequestQueue().getCache().get(getJockyID_URL); }catch (Exception e){ e.printStackTrace(); } 2 を実行した場合、 try { NetworkController.getInstance().getRequestQueue().getCache().get(getJockyID_URL); }catch (Exception e){ e.printStackTrace(); } 3 の出力ファイル名として問題が発生します。 for f in $(find images_dir -type f); do mv -v "$f" ${f////-} done 14 は、ファイルがあることを意味します。 try { NetworkController.getInstance().getRequestQueue().getCache().get(getJockyID_URL); }catch (Exception e){ e.printStackTrace(); } 5 のようなものに改名されました。

コメント内の@gniourf_gniourf通知として、ファイル名にスペースや改行が含まれている場合、これは失敗します。 ホワイトスペース証明:

<事前> <コード> for f in $(find images_dir -type f); do mv -v "$f" ${f////-} done 16
 

Solution in bash:

for f in $(find images_dir -type f); do      mv -v "$f" ${f////-} done 

This finds all files in the images_dir directory, replaces any / in their path with - thanks to the parameter expansion, and moves the file to the new path.

For example, file images_dir/icons/654/321/b.png will be moved to images_dir-icons-654-321-a.png.

Note that if you execute find ., you will encounter an issue as find outputs filenames starting with ./, which means your files will be renamed to something like .-<filename>.

As @gniourf_gniourf notices in the comments, this will fail if your file names include spaces or newlines. Whitespace-proof:

find images_dir -type f -exec bash -c 'for i; do mv -v "$i" "${i////-}; done' _ {} + 
</div
 
 
         
         
0
 
vote

これはあなたのためにそれをするべきです:

<事前> <コード> for file in `find image -iname "*.png"` do newfile=`echo "$file" | sed 's=/=-=g'` mv -v $file $newfile done

バックトック find コマンドは ".png"で終わるファイルのリストに展開され、 -iname はケースに依存しない方法で検索を実行します。

sed コマンドはすべてのスラッシュをダッシュ​​に置き換え、その結果、新しいターゲット名が発生します。

<コード> mv は重いリフティングを行います。 <コード> -v はオプションであり、冗長移動を引き起こします。

デバッグするには、<コード> 9988777666

の前に echo ステートメントを入れることができます。
 

This should do it for you:

for file in `find image -iname "*.png"` do   newfile=`echo "$file" | sed 's=/=-=g'`   mv -v $file $newfile done 

The backtick find command will expand to a list of files ending with ".png", the -iname performs the search in a case independent manner.

The sed command will replace all slashes with dashes, resulting in the new target name.

The mv does the heavy lifting. The -v is optional and will cause a verbose move.

To debug, you can put an echo statement in front of the mv.

</div
 
 
         
         

関連する質問

6  GVIM(クリーム)でRVMを使用する:RVMコマンドが見つかりません  ( Using rvm with gvim cream rvm command not found ) 
私はUbuntuの私のプライマリーエディタとしてGVIM(クリーム)に移動しようとしています。私は素晴らしいRails.vimを使っていますが、私もRVMを使用しています。 RVMはシェル内のものをするときにうまく機能し、Rails.vimで使用したいRub...

65  Bashスクリプト内に短いPythonスクリプトを埋め込む  ( Embedding short python scripts inside a bash script ) 
BASHスクリプトの中にある短いPythonスクリプトのテキストを埋め込み、my .bash_profile 。そのようなことをやることに最適な方法は何ですか? 私がこれまでの解決策は、 -c オプションを使ってPythonインタプリタを呼び出し、 std...

1  Windows Bashスクリプトを使用してユーザー名とパスワードでWebサイトを開く方法  ( How to use windows bash script to open a website with my username and password ) 
私はWindows Bashスクリプトを書くのが好きです.test.bat、Webサイトを開くには、www.test.comと同じ時間に私のユーザー名とパスワードを入力します。 ...

11  bash:文字列からの新規文字文字をストリップ(読み取り行)  ( Bash strip new line character from string read line ) 
次の問題にぶつかった:私は次のようなLinux Bashスクリプトを書いています: ファイルから行を読み込んでください ラインの末尾から<コード> 文字を読み込んでください。 そこにあるコマンドを実行 例: commands.txt <事前> <コー...

111  Bashを使用して、ファイル(引数) "in pland"を編集するコマンドを実行する方法  ( How do i execute any command editing its file argument in place using bash ) 
ファイルtemp.txtを持ち、Bashで sort コマンドで並べ替えたいです。 ソート結果に元のファイルを置き換えてほしい。 これは動作しません(私は空のファイルを取得します): <事前> <コード> sortx temp.txt > temp.txt ...

1607  STDOUTとSTDERRの両方をリダイレクトして追加する方法Bashを使用してファイルに追加しますか?  ( How to redirect and append both stdout and stderr to a file with bash ) 
stdout をbashで切り捨てられたファイルにリダイレクトするには、を使うことがわかります。 <事前> <コード> cmd > file.txt ファイルに追加するファイルに追加することをお知らせします。 <事前> <コード> cmd >> fil...

687  ダブルまたはシングルブラケット、括弧、カーリーブレースの使用方法  ( How to use double or single brackets parentheses curly braces ) 
私は、括弧内の括弧、括弧、巻き毛の括弧、およびそれらの二重または単一の形の違いによって混乱しています。明確な説明はありますか? ...

1  リモートサーバーに追加されているファイルを取得する方法  ( How to get files as they are added to a remote server ) 
リモートサーバー(SSHを使用してSSHを使用して)のBASHスクリプトを使用して、たくさんのPDFファイルを一度にダウンロードするPythonスクリプトを実行します(テキストファイルからダウンロード場所を取得するループ内のURL) リモートサーバからローカル...

22  シェルスクリプティング入力リダイレクト奇妙  ( Shell scripting input redirection oddities ) 
誰かがこの行動を説明することができますか? 実行: <事前> <コード> #!/bin/sh echo "hello world" | read var1 var2 echo $var1 echo $var2 は、OUPUTでは何もしないが: <事前> <...

271  Bashで変数が空のかどうかを見つける方法?  ( How to find whether or not a variable is empty in bash ) 
Bashで変数が空のかどうかを確認できますか? ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有