\
작업하고 싶은 백슬래시가 포함된 파일이 엄청나게 많지만 다음과 같은 작업을 시도할 때마다:
$ ls -li
2036553851 -rw-rw-r-- 1 user user 6757 May 20 00:10 Simplex_config\\B1:B3\\_1.csv
2036553766 -rw-rw-r-- 1 user user 6756 May 20 00:07 Simplex_config\\B1:B3\\_2.csv
2036554099 -rw-rw-r-- 1 user user 6785 May 20 00:20 Simplex_config\\B1:B3\\_3.csv
2036553974 -rw-rw-r-- 1 user user 6785 May 20 00:15 Simplex_config\\B1:B3\\_4.csv
$ find . -type f -name 'Simplex*.csv' | xargs cat > looksee.txt
오류 가 발생합니다 No such file or directory
. 파일명을 바꿔서 그렇게 할까 고민도 해봤는데 더 쉬운 해결방법이 없을지 궁금합니다 inode
.
나는 다음을 생각해 냈습니다.
#!/bin/sh
if [ -f looksee.txt ]; then
rm -rf looksee.txt
fi
ls -i Simplex_config*.csv | awk '{ print $1 }' > inode_list.txt
while IFS= read -r inode;
do
find . -inum $inode -exec cat {} \; >> looksee.txt
done < inode_list.txt
그러나 이것은 매우 번거로운 작업이므로 출력을 구문 분석하고 이를 한 줄 프로그램의 다른 명령으로 파이프하는 방법을 찾고 싶습니다. ls -i Simplex_config*.csv
그러한 옵션을 사용할 수 있습니까?
답변1
1.
find . -type f -name 'Simplex*.csv' -print0 | xargs -0 cat > looksee.txt
~에서manxargs
- 유효하지 않은
-0
입력은 공백이 아닌 널 문자로 종료되며 따옴표와 백슬래시는 특별하지 않습니다(각 문자는 문자 그대로 사용됩니다). 다른 매개변수처럼 처리되는 파일 끝 문자열을 비활성화합니다. 입력에 공백, 따옴표 또는 백슬래시가 포함될 수 있는 경우 유용합니다. GNUfind -print0
옵션은 이 모드에 적합한 입력을 생성합니다.
2.
find . -type f -name 'Simplex*.csv' -exec cat {} + > looksee.txt
~에서사람들이 발견했습니다
-주문을 실행하는 것;
명령을 실행합니다. 상태 0이 반환되면 true입니다. find에 대한 다음 인수는;
다음으로 구성된 인수가 발견될 때까지 명령에 대한 인수로 처리됩니다 . 문자열은{}
일부 버전의 find에서와 같이 별도의 인수뿐만 아니라 명령에 대한 인수에 나타나는 현재 파일 이름으로 대체됩니다.\
쉘 확장으로부터 보호하기 위해 두 구성 모두 이스케이프하거나 인용해야 할 수도 있습니다 . 일치하는 각 파일에 대해 지정된 명령이 한 번 실행됩니다. 이 명령은 시작 디렉터리에서 실행됩니다. 사용 중 불가피한 안전 문제가 있습니다.-구현하다조치를 취해야 합니다.-execdir대신 옵션.-명령 실행 {} +
이 변종-구현하다작업은 선택한 파일에 대해 지정된 명령을 실행하지만 명령줄은 선택한 각 파일 이름을 끝에 추가하여 구성됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다. 명령줄은 xargs가 명령줄을 작성하는 것과 거의 동일한 방식으로 작성됩니다.{}
이 인스턴스는 명령에 하나만 허용됩니다. 이 명령은 시작 디렉터리에서 실행됩니다.
삼.
cat Simplex_config* > looksee.txt
레벨 하위 경로가 1개만 있는 경우.
답변2
권한을 통한 액세스 제어가 중단되므로 inode를 통해 파일에 액세스할 수 없습니다. 예를 들어, 디렉터리를 탐색할 수 있는 권한이 없으면 해당 파일에 대한 권한에 관계없이 해당 디렉터리의 모든 파일에 액세스할 수 없습니다. inode를 통해 파일에 액세스할 수 있으면 디렉터리 권한이 무시됩니다.
따라서 파일의 장치 및 inode 번호를 얻을 수 있지만 해당 파일에 대한 작업을 수행하려면 파일 경로를 찾아야 합니다. (ㅏ길, 아니이것경로는 파일에 여러 개의 하드 링크가 있는 경우 여러 경로를 가질 수 있기 때문입니다. ) 이는 inode를 사용하면 항상 더 많은 작업을 수행해야 함을 의미합니다. inode를 살펴보는 유일한 이유는 하드 링크에 대해 알고 싶고 여러 하드 링크가 있는 각 파일에 대해 한 번만 수행하기 위한 것입니다.
and (시스템에서 사용 가능한 경우) 를 find
사용 하거나 명령을 사용하여 이 작업을 수행 할 수 있습니다. 자세한 내용은 다음을 참조하세요.-print0
xargs -0
-exec
공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?
find . -type f -name 'Simplex*.csv' -exec cat {} + > looksee.txt
find . -type f -name 'Simplex*.csv' -print0 | xargs -0 cat > looksee.txt
답변3
@Costas가 이미 최고의 답변을 주었습니다. 두 번째 질문을 다시 재생해 보세요.
그러나 이것은 매우 번거로운 작업이므로 ls -i Simplex_config*.csv의 출력을 구문 분석하고 한 줄에서 다른 명령으로 파이프하는 방법을 찾고 싶습니다. 이러한 옵션을 사용할 수 있습니까?
xargs를 사용할 수 있습니다.
ls -i | cut -d ' ' -f 1 | xargs -I '$input' find -inum '$input' -exec cat {} \;
이 -I
옵션을 사용하면 표준 입력에서 읽은 내용으로 대체할 문자열을 지정할 수 있습니다.