![여기서 기본 이름이 작동하지 않는 이유 [복제]](https://linux55.com/image/208926/%EC%97%AC%EA%B8%B0%EC%84%9C%20%EA%B8%B0%EB%B3%B8%20%EC%9D%B4%EB%A6%84%EC%9D%B4%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%20%5B%EB%B3%B5%EC%A0%9C%5D.png)
이 작업을 수행할 때 예상되는 파일 이름뿐만 아니라 전체 경로를 반환하는 이유는 무엇입니까(알고 있습니다. 어리석은 일입니다).
ls -l | awk '{print $9}' | xargs -I% find ./my_dir -type f -name "%" -exec echo $(basename {}) \;
그리고, 네, 알아요. 어리석은 일이지만 목표는 basename{}을 {}로 CP하는 것입니다(그리고 and에서는 루프를 사용했습니다 for i in $(ls); do find ./my_dir -type f -name $i -exec cp $i {} \;; done
).
감사해요.
답변1
공백이 포함된 파일 이름(예: ) 또는 공백이 포함된 사용자 또는 그룹 이름이 있는 시스템(예: Active Directory에 가입된 시스템)의 경우 this one.txt
코드가 실패합니다 .
구조 for i in $(ls)
는 다음과 같습니다사용되지 않음. 대신 와일드카드 glob for i in *
, 을 사용하세요.
마지막으로 질문에 직접 답변해 주세요 $(basename {})
. 이 $( ... )
값은 작은따옴표 셸로 보호되지 않으므로 평가됩니다.앞으로명령이 실행됩니다. 결과 $(basename {})
는 간단 {}
하므로,
xargs -I% find ./my_dir -type f -name "%" -exec echo $(basename {}) \;
이것을 입력한 것처럼 파싱되어 실행됩니다.
xargs -I% find ./my_dir -type f -name % -exec echo {} \;
비슷한 것을 찾고 있을 수도 있습니다.
for i in *
do
find ./my_dir -type f -name "$i" -exec cp "$i" {} \; -quit
done
해야 한다는 것을 잊지 마세요언제나$
변수와 표현식을 사용할 때는 큰따옴표를 사용하세요. (공평하게 말하면 이 경우에는 도움이 되지 않지만 익숙해져야 할 부분입니다.)