ファイルを解凍し、解凍したファイルにCDを挿入できるスクリプトを作成しようとしています(つまり、test.zipを解凍してテストフォルダにCDを移動します)。問題は、zipファイルの名前が異なり、名前に関係なく動作するスクリプトを作成しようとしていることです。
現在私は以下を持っています:
for file in $(ls *.zip);
do
unzip ${file}
cd ${file};
done
ただし、$ {file}がまだ.zipファイルであるため、エラーが発生します(エラーを正しく理解した場合)。
どんな提案がありますか?
ありがとうございます。
編集:明確にするために、.zipファイル内のファイルの分析を実行しようとしています。だから私の目標は、まずファイルを解凍し(zipファイルと同じ名前ですが、.zipを持たないディレクトリを作成する)、そのディレクトリにCDを挿入することです。そのディレクトリに入ると、ファイルの分析を開始する別のコード行があります。
答え1
i)zipファイルが新しいディレクトリを作成し、ii)ディレクトリがzipファイルと同じ名前(拡張子を除く)を持っていると仮定すると.zip
(両方の仮定は通常間違っている)、次のことができます。
for file in *.zip
do
unzip -- "$file"
cd -- "${file%%zip}"
done
または、より一般的には、${file%%zip}
構文は削除された${variable%%pattern}
値を返します。ファイル名がある場合に返されます。$variable
pattern
${file%%zip}
foo
foo.zip
これは--
オプションの終わりを表し、ファイル名で終わる場合は-
まったく使用する必要はありません。ls
これは解析後に非常に良いです。ls
非常に壊れやすいので絶対にお勧めしません。。
まず、ディレクトリが存在することを確認して、このプロセスをより複雑にすることができます。
for file in *.zip
do
unzip -- "$file"
[ -d "${file%%zip}" ] && cd -- "${file%%zip}"
done
これは、ディレクトリで実行されるスクリプトでタスクを実行したい場合にのみ便利です。それ以外の場合は、このコマンドを実行しようとしていて、現在のシェルセッションが現在ターゲットディレクトリにある場合、スクリプトを起動したシェルではなくスクリプトをcd
実行しているシェルには影響しないため、これは発生しません。
したがって、ファイルを抽出して新しいディレクトリに移動し、対話型シェルセッションで操作を実行する方法にするには、スクリプトではなく関数として作成する必要があります。
unzipcd(){
for file in *.zip
do
unzip -- "$file"
[ -d "${file%%zip}" ] && cd -- "${file%%zip}"
done
}