이름이 같은 모든 파일 찾기

이름이 같은 모든 파일 찾기

다른 폴더에 같은 이름의 파일이 많이 있습니다. 모든 경로를 찾아 텍스트 파일에 쓰는 방법은 무엇입니까?

답변1

이는 중복된 파일 이름이 있다는 것을 알고 있지만 그것이 무엇인지 모르는 일반적인 경우를 처리합니다.

find -type f -print0 |
    awk -F/ 'BEGIN { RS="\0" } { n=$NF } k[n]==1 { print p[n]; } k[n] { print $0 } { p[n]=$0; k[n]++ }'

awk스크립트 에서는 NULL로 끝나는 파일 경로를 처리하고(따라서 개행 문자가 포함될 수 있는 파일 이름을 처리할 수 있음) 이를 $0현재 파일 경로 이름으로 만듭니다. 이 변수는 n파일 이름 부분을 보유합니다. 이 파일 이름의 발생 횟수를 계산하는 k[]해시( key 로도 간주됨 )이고, 첫 번째 해당 전체 경로 이름을 보유하는 또 다른 해시( key 로도 간주됨)입니다 .np[]n

# Preparation
mkdir -p tmp/a tmp/b
touch tmp/a/xx tmp/a/yy tmp/b/yy tmp/b/zz

# Do it
find tmp -type f -print0 |
    awk -F/ 'BEGIN { RS="\0" } { n=$NF } k[n]==1 { print p[n]; } k[n] { print $0 } { p[n]=$0; k[n]++ }'

tmp/a/yy
tmp/b/yy

# Tidyup
rm -rf tmp

POSIX를 사용하는 경우 find(예: Mac을 사용하는 경우) 해당 옵션이 없으므로 -print0해결 방법과 명령이 약간 다릅니다. 명시적인 시작 디렉터리를 지정해야 합니다. 또한 이 버전은 findNULL로 끝나는 파일 이름을 처리하지 않으므로 개행 문자가 포함되지 않은 파일 이름에만 작동합니다.

find . -type f -print |
    awk -F/ '{ n=$NF } k[n]==1 { print p[n]; } k[n] { print $0 } { p[n]=$0; k[n]++ }'

답변2

나는 다음과 같이 사용합니다 find:

find <path> -type f -name <filename> > same_name.txt

예:

find . -type f -name "foo" > same_name.txt
cat same_name.txt 
./dir_a/foo
./foo
./dir_b/foo
./tmp/foo

위의 코드는 현재 디렉토리부터 시작하여 이름이 지정된 모든 파일을 재귀적으로 찾습니다 foo. 결과는 파일에 저장됩니다same_name.txt

답변3

설치하면 사용할 수 있습니다 locate.

locate filename

또는 파일에 저장:

locate filename > same_name.txt

특정 위치만 검색하려면 grep을 사용하여 결과를 필터링할 수 있습니다.

locate filename | grep "/path/"
# e.g. search only in your /home folder
locate filename | grep "$HOME"

노트:

  • locate많은find데이터베이스 검색을 수행하기 위해 하루에 한 번 하드 드라이브를 검색하므로 속도가 더 빠릅니다 .
  • 오늘 추가한 파일은 찾을 수 없습니다.
  • 특정 경로나 파일 시스템 및 설치에서 파일을 찾지 않습니다. ( cat /etc/updatedb.conf제외된 항목을 보려면 실행하세요.)

답변4

다음 bash스크립트는 스크립트의 명령줄에 지정된 최상위 경로(또는 경로가 지정되지 않은 경우 현재 디렉터리)에서 일반 파일(또는 일반 파일에 대한 심볼릭 링크)과 중복되는 모든 이름을 반복적으로 찾습니다.

:마지막으로, 해당 파일 이름을 찾을 수 있는 구분된 디렉터리 이름 목록 과 함께 각 중복 파일 이름에 대한 요약이 제공됩니다 .

#!/bin/bash

shopt -s globstar  # enable the ** glob
shopt -s dotglob   # also let patterns match hidden files

declare -A dirs    # where we store directories for each found name

for pathname in "${1:-.}"/**; do
    [ ! -f "$pathname" ] && continue  # not something we're interested in

    name=${pathname##*/}
    if [ -n "${dirs[$name]}" ]; then
        # we have seen this filename before
        dups+=( "$name" )
    fi

    # append directory name to ':'-delimited list for this filename
    dirs[$name]=${dirs[$name]:+"${dirs[$name]}:"}"${pathname%/*}"
done

# go through the list of duplicates and 
# print the found directory names for each
for name in "${dups[@]}"; do
    printf '%s:\n\t%s\n' "$name" "${dirs[$name]}"
done

예제를 실행하세요:

$ bash script.sh
somefile:
        ./a:./b
.profile:
        .:./t

요약은 가 .profile현재 디렉토리와 디렉토리에서 발견 t되고 somefile디렉토리 a및 에서 발견됨을 알려줍니다 b.

관련 정보