csv 파일의 정보를 사용하여 파일 이름을 바꿀 수 있는 Stack Exchange의 다른 질문에 있는 정보를 사용했습니다. 이 줄을 사용하면 열 1의 이름에서 열 2의 이름으로 모든 파일의 이름을 바꿀 수 있습니다.
while IFS=, read -r -a arr; do mv "${arr[@]}"; done <$spreadsheet
그러나 맨 위 행의 정보를 비교하려고 시도합니다. 줄을 건너뛸 수 있는 코드를 포함하고 싶습니다. 위의 코드 줄이 어떻게 작동하는지 더 잘 이해하는 것이 좋을 것입니다. 나는 그것이 열(예: A와 B)에 대한 일부 정보를 포함할 것이라고 생각했습니다.
답변1
이 시도:
tail -n +2 $spreadsheet | while IFS=, read -r -a arr; do mv "${arr[@]}"; done
tail 명령은 파일의 마지막 몇 줄만 인쇄합니다. "-n +2"를 사용하면 두 번째 줄부터 시작하여 파일의 마지막 줄을 모두 인쇄합니다.
while 루프에 대해 자세히 알아보세요. mv
while 루프는 새 줄을 사용할 수 있을 때마다 명령을 실행합니다. 이는 while 루프의 조건문을 사용하여 수행됩니다.
IFS=, read -r -a arr
arr
위 작업은 IFS(필드 구분 기호)가 쉼표인 배열로 행을 읽어옵니다 . 이 -r
옵션은 필요하지 않을 수도 있습니다.
그런 다음 mv
명령을 실행하면 "${arr[@]}"가 필드 목록으로 변환됩니다. 여기서 각 필드는 큰따옴표로 구분됩니다. 귀하의 경우 행당 필드가 두 개뿐이므로 해당 두 필드로만 확장됩니다. "${arr[@]}"는 매뉴얼에 설명된 대로 배열에 대한 bash의 특별 규칙입니다.
Any element of an array may be referenced using ${name[subscript]}. The braces are
required to avoid conflicts with pathname expansion. If subscript is @ or *, the
word expands to all members of name. These subscripts differ only when the word
appears within double quotes. If the word is double-quoted, ${name[*]} expands to
a single word with the value of each array member separated by the first character
of the IFS special variable, and ${name[@]} expands each element of name to a sepa-
rate word. When there are no array members, ${name[@]} expands to nothing. If the
double-quoted expansion occurs within a word, the expansion of the first parameter
is joined with the beginning part of the original word, and the expansion of the
last parameter is joined with the last part of the original word. This is analo-
gous to the expansion of the special parameters * and @ (see Special Parameters
above). ${#name[subscript]} expands to the length of ${name[subscript]}. If sub-
script is * or @, the expansion is the number of elements in the array. Referenc-
ing an array variable without a subscript is equivalent to referencing element
zero.