저는 같은 디렉토리에 있는 12개의 채우기 세트를 작업하고 있습니다. 채워진 이름은 _로 구분된 다중 열 형식으로 제공됩니다. 다음은 12개의 필러입니다.
7000_01_lig_cne_767.dlg 7000_05_lig_cne_767.dlg 7000_09_lig_cne_767.dlg
7000_02_lig_cne_767.dlg 7000_06_lig_cne_767.dlg 7000_10_lig_cne_767.dlg
7000_03_lig_cne_767.dlg 7000_07_lig_cne_767.dlg 7000_11_lig_cne_767.dlg
7000_04_lig_cne_767.dlg 7000_08_lig_cne_767.dlg 7000_12_lig_cne_767.dlg
여기서 패딩의 차이는 두 번째 열(1부터 12까지)에 표시되며 모든 이름은 동일하게 유지됩니다.
이러한 파일을 반복하고, 각 파일에 대한 디렉터리를 생성(두 번째 열에 두 파일을 구별하는 패턴 역할을 하는 번호 포함)하고, 특정 파일(예: 7000_04_lig_cne_767 )을 복사하는 데 적합한 간단한 bash 작업 흐름을 작성해야 합니다. dlg) 이 디렉터리(box_04)를 입력합니다. 따라서 생성된 각 하위 폴더에는 파일이 1개만 포함되어야 합니다. 이것은 내 템플릿입니다.
#!/bin/bash
#set the name of folder with all DLG
FILES=$PWD/ALL_DLG
#name of the subfolder in which several subfolders (containing one of the input file) whould be created
output=${home}/sub_folders_to_analyse
# manage DLG filles
for i in ${FILES}/*.dlg
do
# write some expression to take the file according to the number indicated within its second column
# n = is the number occured in the second column;
# manage the files to proper directories
mkdir -p ${output}/"box_$n"
cp "$i" ${output}/"box_$n"
done
for 루프에 정의된 n에는 두 번째 열의 번호(각 파일 이름)를 참조하는 일부 SED 기반 표현식이 포함되어야 한다고 생각합니다.
답변1
파일 이름 구조가 매우 규칙적이므로 이 필드를 추출하는 데 사용할 수 있습니다 cut
.하지만@steeldriver가 지적했듯이 파일 경로에 $PWD/ALL_DLG
이미 1 이 포함되어 있으므로 _
이를 명시적으로 설명하거나 이 basename
명령을 사용하여 작업이 경로 구성 요소가 아닌 실제 파일 이름에만 적용되는지 확인해야 합니다.
n=$(basename "$f" | cut -d'_' -f 2)
cut
파일 이름에 명령(필드 구분 기호로 사용됨 )을 적용 _
하고 두 번째 필드(즉, 식별하려는 숫자)를 추출합니다. 그런 다음 n
명령 대체를 통해 결과를 쉘 변수에 기록합니다.