파일 검색 및 복사에 대한 대안을 찾고 계십니까?

파일 검색 및 복사에 대한 대안을 찾고 계십니까?

themes.txt다양한 폴더에 이름이 다르지만 내용이 다른 파일이 많이 흩어져 있습니다.

locate(!!! 아님) 명령을 사용하여 find검색 하고 cp -backup명령을 사용하여 이름이 지정된 폴더에 복사하고 싶습니다 /home/myhome/1.

Linux Mint 20.3에서 가능합니까? 그렇지 않다면 대체 솔루션이 있습니까?

답변1

옵션(NUL로 구분된 출력용) 및 (파일이 여전히 존재하는지 확인하기 위한 추가 검사)을 locate지원 하고 GNU 및 and 에 대한 지원이 있는 경우 (모두 Linux Mint의 경우에 해당되어야 함):-0-ecpsortxargs-r-0

LC_ALL=C locate -0e '*/themes.txt' |
  LC_ALL=C sort -zV |
  xargs -r0 cp -t ~/1 --backup=numbered

이는 sort -V파일이 복사되는 무작위가 아닌 순서(여기서는 버전 순서)를 얻기 위한 것으로, 이는 필요하지 않습니다.

호출된 정확한 파일을 locate -0e '*/themes.txt'검색 하려면 이 작업을 수행할 수도 있습니다. 구현이 훨씬 더 빠르다는 것을 알았습니다 ( 대신 사용할 수 있다고 수동에 언급되어 있지만 적어도 구현에서는 작동하지 않습니다).themes.txtlocate -0be '[t]hemes.txt'mlocatemlocate\themes.txt'[t]hemes.txtplocate

답변2

 cp --backup=numbered $(locate themes.txt) /home/myhome/1

답변3

IMHO, locate출력을 구문 분석해야 하는 모든 작업의 ​​경우 find쉘 루프를 사용하는 것이 가장 좋습니다. 이는 부분적으로는 Unix 파일 이름의 특성(개행 문자가 포함될 수 있음) 때문이고 부분적으로는 locate사용된 데이터베이스가 오래되었을 수 있기 때문입니다.

findand를 사용 하지 않고도 locate이를 수행 할 수 있습니다 bash.

shopt -s globstar
shopt -s nullglob dotglob

for pathname in ./**/themes.txt; do
    cp -b "$pathname" ~/1/
done

**이렇게 하면 먼저 경로 이름 내에서 일치하는 /(따라서 하위 디렉터리에 "반복적으로") 일치하는 와일드카드 패턴을 사용할 수 있습니다 . 그런 다음 nullglob일치하지 않는 패턴을 제거하고 dotglob숨겨진 이름에 대한 패턴 일치를 허용할 수 있습니다.

이 루프는 이동하려는 모든 이름을 반복하여 현재 디렉토리 또는 하위 디렉토리에서 일치시킨 다음 각 이름 cp -b( 동일함)을 -b홈 디렉토리 아래에 --backup호출된 디렉토리 에 복사합니다.1

이는 현재 디렉토리가 홈 디렉토리가 아니라고 가정합니다. 이는 대상 디렉토리의 파일을 포함하기 때문입니다.

이러한 파일 중 일부만 가지고 있다는 것을 알고 있는 경우 themes.txt다음 명령을 사용할 수 있습니다.

shopt -s globstar dotglob failglob
cp -b -t ~/1/ ./**/themes.txt

in을 사용하면 일치하는 이름이 없으면 failglob명령이 정상적으로 실패합니다 (패턴이 이름과 일치하지 않으면 쉘은 명령을 실행하려고 시도하지도 않습니다).nullglob

위 명령은 일치하는 이름이 실제로 일반 파일인지 여부를 테스트하지 않습니다(디렉토리, 심볼릭 링크 또는 기타 비정규 파일일 수 있음). 이를 위해 다음을 사용할 수 있습니다.

shopt -s globstar
shopt -s nullglob dotglob

for pathname in ./**/themes.txt; do
    if [ -f "$pathname" ] && [ ! -L "$pathname" ]; then
        cp -b "$pathname" ~/1/
    fi
done

이는 일반 파일만 복사하고 비정규 파일과 일반 파일에 대한 심볼릭 링크를 방지합니다.


그걸로 find당신은해야합니다

find . -name themes.txt -type f -exec cp -b -t ~/1/ {} +

즉, 현재 디렉터리나 다음 디렉터리의 어느 곳에서든 가능한 한 cp -b -t ~/1/많은 일반 파일을 한 번에 호출합니다. themes.txt이것의 장점은 cp통화 횟수를 최대한 줄일 수 있다는 것입니다.

관련 정보