다음 코드는 디렉터리에 파일 목록을 만든 다음 무작위 순서로 섞은 다음 파일을 list.txt라는 텍스트 문서로 내보냅니다.
find *.EXT | sed 's:\ :\\\ :g' | sed 's/^/file /' | sort -R > list.txt
파일의 내용은 다음과 같습니다.
file filename_2.EXT
file filename_3.EXT
file filename_1.EXT
file filename_4.EXT
file filename_5.EXT
list.txt에서 먼저 보고 싶은 파일 이름을 지정하고 나머지 파일 이름을 위 코드처럼 무작위로 지정하는 것이 가능한지(터미널에서, 명령줄에서 매우 쉽게) 알고 싶습니다. .
명령줄에서 이 작업을 어떻게 쉽게 수행할 수 있는지, 동일한 코드 줄이나 다른 코드에서 수행할 수 있는지는 내가 달성하려는 목표를 달성하는 한 중요하지 않습니다.
find *.EXT | sed 's:\ :\\\ :g' | sed 's/^/file /' | sort -R > list.txt
다음과 같이 보일 수 있습니다:
(이것은 내가 달성하고 싶은 것을 이해하는 것입니다)
find *.EXT | xsort --comefirstfiles=filename_3.EXT,filename_1.EXT | xsort --therest random | sed 's:\ :\\\ :g' | sed 's/^/file /' > list.txt
가능합니까? 그렇지 않다면 "찾기" 코드와 같은 줄에서 이 작업을 수행하는 가장 가까운 옵션은 무엇입니까?
답변1
zsh에서:
files=( **/*.EXT(oe'{REPLY=$RANDOM}') )
first=(input3.EXT input5.EXT)
printf 'file %s\n' ${first[@]} ${files:|first} > list.txt
첫 번째 줄은 찾으려는 모든 파일의 배열을 (재귀적으로) 할당하지만 무작위로 정렬합니다.
두 번째 줄은 원하는 파일 이름 배열을 지정합니다.첫 번째결과 목록에 있습니다.
세 번째 줄은 파일 이름을 list.txt에 인쇄합니다(접두사 "file "
; ; 두 개의 인수는 파일이고 first
그 뒤에 나머지가 옵니다 files
. 그러나 후자는 배열 삭제 구문을 사용하여 :|
배열에 있는 "파일"에서 "첫 번째" 항목을 제거합니다.
이 예시 입력에서는 다음과 같습니다.
$ tree .
.
├── input1.EXT
├── input2.EXT
├── input3.EXT
├── input4.EXT
├── input5.EXT
└── subdir
└── subdirfile1.EXT
첫 번째 예제 실행은 다음과 같습니다.
$ files=( **/*.EXT(oe'{REPLY=$RANDOM}') )
$ first=(input3.EXT input5.EXT)
$ printf 'file %s\n' ${first[@]} ${files:|first}
file input3.EXT
file input5.EXT
file subdir/subdirfile1.EXT
file input4.EXT
file input1.EXT
file input2.EXT
후속 예제 실행은 다음과 같습니다.
$ files=( **/*.EXT(oe'{REPLY=$RANDOM}') )
$ first=(input3.EXT input5.EXT)
$ printf 'file %s\n' ${first[@]} ${files:|first}
file input3.EXT
file input5.EXT
file input1.EXT
file input2.EXT
file subdir/subdirfile1.EXT
file input4.EXT