特別な方法でファイルを一括コピーしたいです。スクリプトが必要ですか?

特別な方法でファイルを一括コピーしたいです。スクリプトが必要ですか?

私は数年間Linuxを使用してきましたが、コンソールにはあま​​り慣れていません。簡単なコピーコマンドを管理できますが、今私が知っている範囲を超える要件がありました。

私は多数のディレクトリ(folder1、folder2、folder3など)を持っています。各ディレクトリには、同じ名前(file.txtなど)を持つファイルがあります。これで、これらのファイルをディレクトリに一括コピーし、そのディレクトリの名前をファイル名として使用したいと思います。元のファイルは変更されていないままにしてください。

これにより、「folder1/file.txt」が「folder1/folder1.txt」にコピーされます。

これは、各ディレクトリに同じ内容を持つ2つのファイルが必要です。そのうちの1つは、ディレクトリと同じ名前でなければなりません。

これを行うにはbashスクリプトが必要だと思います。そうですか?それでは、このスクリプトはどのようなものでしょうか?

助けてくれてありがとう。

いじめる

答え1

はい、スクリプト(または他のプログラムを使用する場合はかなり複雑なスクリプト)が必要です。しかし、それほど長くも従わずにも難しくありません。

#/------------------------------ for … in … : go through the list supplied after
#|                               the "in" one by one, setting the variable
#|                               specified after the "for" to each element from
#|                               the list, in turn
#| 
#|      /----------------------- original: name of variable to set to each value
#|      |
#|      |           /----------- */file.txt: the list of all "foldername/file.txt"
#|      |           |
#|  /------\    /--------\   
for original in */file.txt ; do

  folder_only="${original%/file.txt}"
  #\--------/  \-------------------/
  #    |                 |
  #    |                 \------------ become the value of "original", but cut off
  #    |                               any "/file.txt" from the end; for example:
  #    |                               "folder1/file.txt" becomes "folder1"
  #    |
  #    \------------------------------ save the result in a variable that's called
  #                                    "folder_only"

  cp -- "${original}" "${folder_only}/${folder_only}.txt"
done

または説明なし:

for original in */file.txt ; do
  folder_only="${original%/file.txt}"
  cp -- "${original}" "${folder_only}/${folder_only}.txt"
done

答え2

bashの代わりにzshシェルを使用すると、次のような非常に強力な自動ロード機能が提供されるため、一括名前変更またはコピーを実行する方がはるかに簡単ですzmv

autoload -Uz zmv # best in your ~/.zshrc
zmv -C '(folder<->)/file.txt' '$1/$1.txt'

ここで、folder<->一致folderの後にASCII 10進数シーケンスが続きます。*フォルダ名がパターンに従う必要がない場合は、folder<digits>justに変更してください。

関連情報