다른 위치에 같은 이름의 파일이 있는 파일 시스템 트리가 있습니다. 명령줄에서 다음 명령을 시도했습니다.
find / -name "HAHA" -exec mv {} /home \;
하나의 파일에서만 작동하며 다른 파일의 경우 동일한 이름의 오류 메시지가 나타납니다.
각 파일 이름에 숫자를 추가하여 구별하도록 명령을 변경할 수 있습니까?
답변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
/home
HAHA
HAHA.~1~
HAHA.~2~
/home
이 쉘 스크립트는 트릭을 수행해야 하지만 개행 문자가 포함된 경로에 저항하지 않습니다.
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 ''
read
i=1
bash
답변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
테스트용으로 사용하고 필요에 맞으면 삭제하세요.