“찾기”에서 찾은 파일을 복사하고 이름을 바꾸는 방법은 Linux입니까?


17

나는라는 폴더가 /home/user/temps487 개 폴더가 있습니다. 각 폴더에는 thumb.png라는 파일이 있습니다.

thumb.png라는 모든 파일을 별도의 폴더에 복사하고 원래 폴더를 기준으로 이름을 바꿉니다.


그것들의 이름을 바꾸는 방법? 디렉토리 구분 기호를 무언가로 바꾸면 밑줄 (_)이라고 말하면 이미 밑줄이있는 파일과 충돌 할 수 있습니다. 유효한 모든 문자에 대해 사실이며 파일 이름에서 금지되는 / 및 \ 0 옆에는 안전한 항구가 없습니다. 모든 문자가 충돌을 일으킬 수 있습니다.
사용자가 알 수 없음

폴더에 하위 폴더가 있거나 단순한 일반 폴더 구조가 있습니까?
사용자 알 수 없음

답변:


8

여기 있습니다 :

for file in /home/user/temps/*/thumb.png; do new_file=${file/temps/new_folder}; cp "$file" "${new_file/\/thumb/}"; done;

편집하다:

그건 그렇고, 일반적인 지혜는 find이것을 사용 하는 것이 나쁜 생각이라는 것입니다. 단순히 쉘 확장을 사용하는 것이 훨씬 더 안정적입니다. 또한 이것은 가정 bash하지만 안전한 가정이라고 생각합니다. :)

편집 2 :

명확하게하기 위해, 나는 그것을 분해 할 것이다 :

# shell-expansion to loop specified files
for file in /home/user/temps/*/thumb.png; do

    # replace 'temps' with 'new_folder' in the path
    # '/home/temps/abc/thumb.png' becomes '/home/new_folder/abc/thumb.png'
    new_file=${file/temps/new_folder};

    # drop '/thumb' from the path
    # '/home/new_folder/abc/thumb.png' becomes '/home/new_folder/abc.png'
    cp "$file" "${new_file/\/thumb/}";
done;

${var/Pattern/Replacement}구문 에 대한 자세한 내용은 여기를 참조하십시오 .

cp줄 의 따옴표 는 파일 이름에서 공백과 줄 바꿈 등을 처리하는 데 중요합니다.


new_file = new_folder? 슬래시 앞의 백 슬래시의 목적은 무엇입니까 new_file/\/thumb?
사용자가 알 수 없음

1
@user : ${VARIABLE/PATTTERN/REPLACEMENT}값을 생성 VARIABLE하지만 대체 텍스트로 패턴을 대체합니다. 여기서 패턴은 /thumb( /이렇게 보이지 않도록 이스케이프 처리해야하며 ${new_file//PATTERN/REPLACEMENT}, 이는 첫 번째 발생 대체 대신 글로벌 대체가 됨) 대체 텍스트는 비어 있습니다.
Gilles 'SO- 악마 중지'

물론 지금은 봅니다. :)
사용자가 알 수 없음

1
당신은 487 디렉토리가 바로 아래에 있다고 가정하고 /home/user/temps있습니다. 그렇지 않은 경우, 당신은 필요 찾을**.
Gilles 'SO- 악마 그만'

@Gilles-저는 실제로 질문을 읽는 방법입니다. 그래도 요점을 감사하십시오 :)
simon

5

이것은 임의로 깊은 하위 디렉토리에서 작동합니다.

$ find temps/ -name "thumb.png" | while IFS= read -r NAME; do cp -v "$NAME" "separate/${NAME//\//_}"; done
`temps/thumb.png' -> `separate/temps_thumb.png'
`temps/dir3/thumb.png' -> `separate/temps_dir3_thumb.png'
`temps/dir3/dir31/thumb.png' -> `separate/temps_dir3_dir31_thumb.png'
`temps/dir3/dir32/thumb.png' -> `separate/temps_dir3_dir32_thumb.png'
`temps/dir1/thumb.png' -> `separate/temps_dir1_thumb.png'
`temps/dir2/thumb.png' -> `separate/temps_dir2_thumb.png'
`temps/dir2/dir21/thumb.png' -> `separate/temps_dir2_dir21_thumb.png'

interessting 부분은 매개 변수 확장 ${NAME//\//_} 입니다. 의 내용을 취하고 NAME모든 발생을 /로 대체합니다 _.

참고 : 결과는 작업 디렉토리 및 find의 경로 매개 변수에 따라 다릅니다. temps의 상위 디렉토리에서 명령을 실행했습니다. 교체 cpecho실험한다.


이름에 줄 바꿈이 포함 된 파일에서 실패합니다.
사용자 알 수 없음

잘 작동했습니다. 한 가지 더, 나는 또한 일부 하위 디렉토리에 zip 파일이 거의 없습니다. 거기에서 imgae를 추출하는 것이 가능합니까? 'zip tar'를 기억하십시오
Mirage

1

짧은 도우미 코드 :

#!/bin/bash
#
# echo cp "$1" ../tmp/"${1//\//_}" 
#
mv "$1" ../tmp/"${1//\//_}"

이름을 'deslash.sh'로 지정하고 실행 가능하게 만드십시오. 다음과 같이 전화하십시오.

find -type f -name thumb.png -exec ./deslash.sh {} ";"    

충돌이 있으면 실패합니다

a/b/thumb.png # and 
a_b/thumb.png 

그러나 그것은 불가피합니다.


0

이 시도

mkdir /home/user/thumbs
targDir=/home/user/thumbs

cd /home/user/temps

find . -type d | 
 while IFS="" read -r dir ; do
   if [[ -f "${dir}"/thumb.png ]] ; then
     echo mv -i "${dir}/thumb.png" "${targDir}/${dir}_thumb.png"
   fi
done

편집하다

귀하의 디렉토리 이름에 공백 문자가 포함 된 경우 인용을 추가했습니다.

또한 이것을 변경 하여 실행할 명령 인쇄합니다. 스크립트의 출력을 검사하여 모든 파일 / 경로 이름이 올바른지 확인하십시오. 실행될 명령에 문제가없는 것으로 확인되면을 제거하십시오 echo.


더 많은 하위 폴더에 일부 png 파일이 있습니다. 그 기능이 작동합니까
Mirage

"A A" mv -i ./A A/thumb.png ../tmp/.png폴더의 경우 다음을 생성합니다 .-모든 파일은 ../tmp/.png로 끝납니다 (../tmp는 내 대상 디렉토리입니다).
사용자 알 수 없음

위 코드의 모든 변수에 따옴표와 중괄호를 추가하십시오 (예 : "$ {dir}"
shellter

@ Mirror51은 다음과 같이 썼다 : "일부 하위 폴더에있는 파일은 작동 할 것이다". 그렇습니다. 이 스크립트의 각 단계를 개별적으로 (또는 파이프 할 때 각 파이프 세트) 실행할 수 있다는 것을 알고 계셨습니까? 당신은 단지 실행 find -type d하고 출력을 볼 수 있습니다 . 그것은 당신이 기대하는 모든 디렉토리를 얻습니까? 그렇지 않은 경우 문제를 보여주기 위해 출력을 추가하십시오. 행운을 빕니다.
shellter

작동하지 않습니다. 마스킹으로 해결할 수없는 두 개의 인스턴스로 read dir디렉토리 a\nba와 b 에서 단어 분할을 수행합니다 .
사용자 알 수 없음

-1

복사하려면 cp 명령이 필요하고 linux의 이름을 바꾸는 것은 파일을 이동하는 것과 동일하므로 mv 명령을 사용 하여 수행해야합니다 . Linux에서는 항상 다른 폴더에있는 경우 소스에서 대상 폴더까지 전체 경로를 지정해야합니다. 나는 복사와 같은 것이 될 것입니다.

cp /source_path/file /destination_path/

또는 이름을 바꾸거나 이동

mv /source_path/old_file /destination_path/new_name_file

이것은 포스터 문제의 작은 부분 일뿐입니다. 이제 디렉토리를 반복하고 썸네일을 복사하는 방법을 설명하십시오 :-)

OP는 사용하고 싶어find

네, 그렇습니다 ... 나에게 무슨 일이 있었는지 모르겠어요 ...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.