특별한 방법으로 파일을 일괄 복사하고 싶습니다. 스크립트가 필요합니까?

특별한 방법으로 파일을 일괄 복사하고 싶습니다. 스크립트가 필요합니까?

저는 몇 년 동안 Linux를 사용해 왔지만 콘솔에는 그다지 익숙하지 않습니다. 간단한 복사 명령을 관리할 수 있지만 이제 제가 아는 범위를 넘어서는 요구 사항이 생겼습니다.

나는 많은 수의 디렉토리(folder1,folder2,folder3 등)를 가지고 있습니다. 각 디렉토리에는 동일한 이름(예: file.txt)을 가진 파일이 있습니다. 이제 이러한 파일을 디렉터리에 일괄 복사하고 해당 디렉터리의 이름을 파일 이름으로 사용하고 싶습니다. 원본 파일은 변경되지 않은 상태로 유지되어야 합니다.

그러면... "folder1/file.txt"가 "folder1/folder1.txt"로 복사됩니다.

이는 각 디렉터리에 동일한 내용을 가진 두 개의 파일이 있어야 하며 그 중 하나는 디렉터리와 이름이 동일해야 함을 의미합니다.

이 작업을 수행하려면 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로 바꾸세요.

관련 정보