디렉토리에서 모든 파일에 대해 동일한 이름을 가진 파일 수 인쇄


1

나는 리눅스를 처음 접했고 디렉토리의 파일과 하위 디렉토리의 모든 이름을 인쇄하는 쉘 스크립트를 작성 해야하는 과제가 있는데 (매개 변수로 제공) 모든 파일에 대해 동일한 이름의 파일 수를 인쇄해야합니다 이 디렉토리에서.

내 문제는 모든 파일과 디렉토리의 이름을 인쇄하고 작업의 두 번째 부분을 수행 할 수 있었지만 함께 가져올 수 없다는 것입니다. 즉, 출력에는 두 가지 부분이 있습니다.

/some/path
a1  
a2 
a3

a1 1
a2 1
#a1, a2 files and a3 directory

그리고 다음과 같이 보일 것입니다 :

a1 1
a2 1
a3 

이것은 내가 쉘 스크립트를 작성하는 데 사용한 코드입니다.

#the first part that prints all the names from the directory
mydir=$1
cd $mydir
ls -l $mydir | awk '{print $9}'

#the second part that prints the number of files with the same name for every file
file=$(find $mydir -type f -printf '%f\n' | sort | uniq -c)
echo $file

기존 답변이 문제를 해결합니까? 그렇다면 확인 표시가있는 것을 잊지 마십시오. 감사합니다! 그렇지 않은 경우 어떤 일이 있었는지 알려주십시오.
Jeff Schaller

답변:


2

"learning Linux / shell scripting"과제와 관련하여 다음과 같은 내용을 제안합니다.

mydir=$1

for f in "$mydir"/*
do
  printf "%s %d\n" "$f" $(find "$mydir" -name "$f" -print 2>/dev/null | wc -l)
done

스크립트에서 조정 :

  1. 할 필요가 없습니다 cd하기 위해 디렉토리에 ls
  2. awk파일 이름이 필요 없습니다 . 그냥 할 수는 ls있지만 ...
  3. 출력을 분리 ls ... awkfind방법 과 별도로 실행
  4. find당신이하고있는 모든 것이 출력을 세는 것이라면 출력 을 특별히 인쇄 할 필요가 없습니다
  5. 당신이하고있는 모든 것이 그것을 계산하는 경우 출력을 정렬 할 필요가 없습니다.
  6. uniq모두 잡으려고 할 때 사용할 필요가 없습니다.
  7. -type f당신의 임무가 당신 이 같은 이름의 디렉토리 를 찾길 원한다면 제거의 자유를 가져 왔습니다
  8. 이름 -name "$f"find일치하는 파일 만 일치하도록 추가
  9. printf파일 이름과 카운트를 동일한 출력 줄에 결합하는 데 사용
  10. ls파일 이름을 얻기 위해 출력을 구문 분석 할 필요가 없습니다 . 그것은 for f in "$mydir"/*특히 *-하는 것입니다. 파일 이름과 일치하도록 확장됩니다.

또한 사용자가와 같은 파일 이름을 제공하는 경우 모든 변수 사용법을 인용했습니다 "this file".

출력에 숨겨진 파일은 표시되지 않습니다. 도트 파일 (숨겨진 파일)과 일치 shopt -s dotglob하도록 "$mydir"/*확장을 추가 할 수도 있습니다 .

고급 경고로서 사용자가 줄 바꿈이 포함 된 파일 이름을 전달하여 찾는 경우 줄 바꿈이 포함 된 파일 이름을 잘못 계산합니다.


귀하의 의견에 대한 지연된 답변에 대해 사과드립니다. 귀하의 제안은 저에게 정말 큰 도움이되었으며, 이로 인해 제 과제를 제 시간에 완수 할 수있었습니다. 감사합니다!
Stefana Baltatescu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.