실제로 파일 이름을 나열할 수 있지만 거기에서도 원하지 않는 내용이 많이 나옵니다.
> echo "ls *.txt" | sftp user@host:/dir
Connected to 1.1.1.1.
Changing to: /dir
sftp> ls *.txt
1.txt
2.txt
3.txt
파일만 나열하고 파일만 나열하는 입증되고 신뢰할 수 있는 방법이 있습니까? 가능하면 head
유사한 필터를 사용하지 않고 싶습니다.
답변1
옵션을 사용하여 예라고 -q
말하세요sftp
큐ueet, 따라서 관심 없는 대부분의 출력을 억제합니다.
echo "ls *.txt" | sftp -q [email protected]:/path
예를 들어 에코하고 있는 대화형 프롬프트 줄은 계속 표시되지만 다음을 sftp> ls *.txt
사용하여 해당 줄을 필터링할 수 있습니다 grep -v
.
echo "ls *.txt" | sftp -q [email protected]:/path | grep -v '^sftp>'
그런데 가장 좋은 방법은 배치 파일을 사용하여 파이핑하는 -b
대신 매개변수 sftp
와 함께 전달하는 것입니다.echo
만약 여러분이진짜당신이 하고 싶은 일은목록ssh
파일을 사용하는 것보다 실제로 더 나을 수도 있습니다 sftp
(결국예이것에스에쿠르에프엘리티옮기다 피프로그램):
ssh [email protected] ls -1 /path
답변2
원격 디렉토리 트리를 마운트하여SSHFS. SSHFS는 SFTP 프로토콜을 사용하여 원격 파일에 액세스하는 원격 파일 시스템입니다. 서버가 SFTP 액세스를 허용하는 경우 SSHFS를 사용할 수 있습니다(서버 관점에서도 마찬가지입니다). 클라이언트 측에서 사용하려면 승인이 필요합니다.퓨즈, 이는 대부분의 최신 unice의 경우입니다.
파일 시스템이 마운트되면 파일이 실제로 원격인지 여부에 관계없이 모든 일반적인 명령을 사용할 수 있습니다.
mkdir host-dir
sshfs user@host:/dir host-dir
echo host-dir/*.txt
…
fusermount -u host-dir
답변3
sftp -q user@host:/dir <<<"ls *.txt" | grep -v '^sftp>`
그러나 이는 sftp가 비밀번호를 요구하지 않는 경우에만 작동합니다. grep -v는 sftp의 비밀번호 요청에 영향을 미치기 때문입니다.
하지만 tail을 사용하면 많은 경우에 매우 간단해질 것이라고 생각합니다.
sftp -q user@host:/dir <<<"ls *.txt" | tail -n+2
답변4
디렉토리에는 파일만 있다고 가정합니다. 그러나 하위 디렉터리가 있는 경우 해당 디렉터리도 내보내기 목록에 포함됩니다. 따라서 어떻게든 하위 디렉터리도 필터링해야 합니다. ls -l을 사용하고 d로 시작하는 행을 필터링할 수 있습니다.
sftp -q user@host:/dir <<<"ls -l *.txt" | grep -v -E "^sftp|^d"
그러나 이것은 여전히 심볼릭 링크를 남길 것입니다. 따라서 아마도:
sftp -q user@host:/dir <<<"ls -l *.txt" | grep -v "^sftp"| grep -- ^-
어디
grep -v -E "^sftp|^d"
필터 sftp cmd 또는 ^d - 디렉토리 인쇄, ^l 심볼릭 링크.. 또 무엇이 있나요?grep -- ^-
파일만 표시됩니다.
그러나 ls -l..에는 중복된 정보가 있으므로 이 역시 잘라야 합니다. 직접 방법으로 cut 또는 awk를 사용하십시오.
sftp -q user@host:/dir <<<"ls -l *.txt" | grep -v "^sftp"| grep -- ^- | tr -s ' '|cut -d' ' -f9
sftp -q user@host:/dir <<<"ls -l *.txt" | grep -v "^sftp"| grep -- ^- | awk -F' ' '{print $9}'
sftp -q user@host:/dir <<<"ls -l *.txt" | grep -v "^sftp"| grep -- ^- | cut -c57-
tr -s ' '
반복되는 공백을 압축합니다. Turther 필드 정렬에 사용됩니다.cut -d' ' -f9
필드 #9만 유지합니다(일반적으로 파일 이름이지만 시스템을 확인하세요).awk -F' ' '{print $9}'
9번째 필드만 출력됩니다.cut -c57-
문자 1-56을 제거하고 내 시스템에 파일 이름을 유지합니다. 이 취약한 부분은 파일 이름에 공백이 있을 때 제가 찾은 유일한 옵션입니다...
그래서 간단한 목록을 얻는 것은 정말 이상합니다.sftp 파일만추가 처리에 사용할 수 있습니다..
업데이트: 파일 이름에 공백이 포함된 경우 cut -c57-
ls -l에서 파일 이름을 추출하는 것보다 더 좋은 방법을 찾을 수 없습니다. 하지만 시스템마다 ls 출력에서 이름 필드 위치가 다를 수 있고 파일 소유자 이름이 길면 동일한 시스템에서도 데이터를 이동할 수 있기 때문에 신뢰할 수 없습니다. ls -n
이름을 숫자 ID로 바꾸는 를 사용하면 이 문제를 피할 수 있지만 이 접근 방식은 여전히 "좋지" 않습니다.
awk를 사용하여 $0의 첫 번째 위치인 $9에서 시작하여 $0 줄의 끝까지 파일 이름을 추출하려고 합니다. awk에서 $0 라인에 있는 $9 필드의 위치를 얻는 방법을 아는 사람이 있나요?
나는 이것을 수행하는 확실한 방법을 찾지 못했습니다. index($0,$9)
파일 이름이 첫 번째 열의 사용자 이름이나 숫자와 일치하면 잘못된 결과가 생성됩니다. $1,$2..$8의 합계를 계산하는 것도 length
필드 구분 기호가 순서대로 반복되기 때문에 잘못된 것입니다.
ls -n *
또한 를 사용하면 디렉토리 이름 뒤에 인쇄되어 /
필터링이 쉬워진다는 것을 알았습니다 . 그러나 가 있는 glob 마스크를 사용하면 ls
아무 것도 발견되지 않으면 메시지(Can't ls: "/curdir/*" notfound)가 stderr에 보고되는데 이는 성가신 일입니다.
그렇다면 sftp에서 공백 및 기타 특수 문자가 포함된 파일 이름을 처리할 수 있는 일반 파일 목록을 얻는 방법을 아는 사람이 있습니까?