파일 시스템에 흩어져 있는 동일한 이름을 가진 모든 파일을 하나의 폴더로 이동하는 방법은 무엇입니까?

파일 시스템에 흩어져 있는 동일한 이름을 가진 모든 파일을 하나의 폴더로 이동하는 방법은 무엇입니까?

다른 위치에 같은 이름의 파일이 있는 파일 시스템 트리가 있습니다. 명령줄에서 다음 명령을 시도했습니다.

find / -name "HAHA" -exec mv {} /home \;

하나의 파일에서만 작동하며 다른 파일의 경우 동일한 이름의 오류 메시지가 나타납니다.

각 파일 이름에 숫자를 추가하여 구별하도록 명령을 변경할 수 있습니까?

여기에 이미지 설명을 입력하세요.

답변1

두 가지 가능한 해결책을 생각해 볼 수 있습니다.

  1. 당신이 mv출신 이라면GNU 핵심 도구(그럴 수도 있음) 그런 다음 다음 명령을 실행합니다.

    find / -name "HAHA" -type f -exec mv --backup=numbered "{}" /home \;
    

    ...호출된 모든 파일을 .this HAHA로 이동합니다./home--backup=numbered 옵션of는 명령이 실행될 mv때마다 mv지정된 파일이 대상 디렉터리에 이미 있는지 확인합니다 HAHA. 그렇다면 새 파일을 로 이동하기 전에 먼저 이름을 HAHA.~n~( 증가된 숫자는)로 바꿉니다 . 마지막으로 등의 이름을 가진 파일을 얻게 됩니다 .n/homeHAHAHAHA.~1~HAHA.~2~/home

  2. 이 쉘 스크립트는 트릭을 수행해야 하지만 개행 문자가 포함된 경로에 저항하지 않습니다.

    IFS="
    "      # if you are using bash, you can just use IFS=$'\n' here
    i=1
    for file in $(find / -name "HAHA" -type f); do
      mv "${file}" "/home/HAHA${i}"
      i=$((${i} + 1))
    done
    

    HAHA이는 모든 파일을 반복 하고 각 파일을 로 이동합니다 /home/HAHAn. 여기서 n숫자는 다시 1부터 증가하기 시작합니다.

답변2

작은 스크립트로 간단한 솔루션을 찾았습니다. 스크립트는 cpf(또는 사용자가 지정한 이름으로) 호출되며 다음과 같습니다.

#!/bin/bash

dir=xyz       # Directory where you want the files
num=1

for file in "$@"
do
    base=`basename -- "$file"`
    mv -- "$file" "$dir/$base.$num"
    num=$(($num+1))
done

다음과 같이 명령을 실행합니다.

find . -name HAHA -print0 | xargs -0x cpf

답변3

while루프를 사용하겠습니다 .

i=1
find / -name 'HAHA' -print0 | while read -d '' -r file; do mv "$file" "/home/${file##.*/}$((i++))"; done

여기서 중요한 것은 print0옵션이 ( options find와 함께 ) 이름에 공백이 있는 파일을 올바르게 처리한다는 것입니다. 이와 같은 작업을 한 번만 수행해야 하는 경우 첫 번째 줄을 설정할 필요가 없습니다. (대부분의 다른 쉘과 마찬가지로) 이 변수는 자동으로 생성되기 때문입니다.-d ''readi=1bash

답변4

GNU 병렬성을 사용할 수 있습니다.

find / -name "HAHA" -type f | parallel 'echo mv {}
 ./dest-dir/{/}_`stat -c%i {}`

{/}  ............. returns dirname
{/.} ............. dirname with no extension
stat -c%i {} ..... gets the inode for each file "whic is unique"

OBS: echo테스트용으로 사용하고 필요에 맞으면 삭제하세요.

관련 정보