Linuxマシンのフォルダーに多くのtar.gzファイルがあり、tar.gzファイル名と一致するサンプル名を含むテキストファイルもあります。
Current_directory
|_______TDF.tar.gz
|_______DFG.tar.gz
|_______GHY.tar.gz
現在のディレクトリにあるnames.txtファイルは次のようになります。
Tar.gz_filenames Sample_Names
DFG.tar.gz Sample2
TDF.tar.gz Sample1
GHY.tar.gz Sample3
したがって、それらの一致に基づいて、Current_directoryに次の出力が必要です。
Output:
Sample1.tar.gz
Sample2.tar.gz
Sample3.tar.gz
私は次のように試しましたが、うまくいきませんでした:
for j in .tar.gz ; do
sed "s/\(\w\+\)\s\+\(\w\+\)/mv '*_\1$j' '*_\2$j'/e" names.txt
done
私の質問の小さな更新:このコマンドを使用したときcat -e names.txt
私は次のように見えます:
Tar.gz_filenames Sample_Names^M$
DFG.tar.gz Sample2^M$
TDF.tar.gz Sample1^M$
GHY.tar.gz Sample3
ファイル名に空白がないと仮定する別の方法:
$ xargs -n2 echo mv -i <<<"$(sed '1d; s/$/.tar.gz/' names.txt)"
mv -i TDF.tar.gz Sample1.tar.gz
mv -i DFG.tar.gz Sample2.tar.gz
mv -i GHY.tar.gz Sample3.tar.gz
sed '1d; s/$/.tar.gz/'
では、1d
は入力fileNamenames.txt
の最初の行を削除し、次にs/$/.tar.gz/
はすべての行の終わりに.tar.gz
を追加します($
行末までポニート)。
xargs -n2
では、Space /またはTabで区切られた2セットの文字列を読み取っています。
注:
cat -e names.txt
の出力に基づいて、そのファイルはUnixタイプの行末形式ではありません。Unixタイプに変換するには、dos2unix fileName
を実行してから、上記のコマンドを適用して名前を変更します。
ドライランの場合はecho
を削除します。
あなたの名前に空白がなく、あなたのnames.txt
ファイルには、表示されているように最初の行にヘッダーがあります。次のことができます。
tail -n +2 names.txt | while read old new; do
mv -i "$old" "$new"
done
tail -n +2
は、2番目から始まるファイルのすべての行を出力するため、ヘッダーをスキップします。そうして -i
option for GNU mv
は、既存のファイルを上書きする前にプロンプトを表示するように指示します(名前の衝突がある場合に備えて)。
シェルの使用:tarfile名にはスペースが含まれておらず、サンプル名にはスペースが含まれていないと想定しています。
{
read header
while read -r tarfile sample; do
if [[ -f "$tarfile" ]]; then
echo mv "$tarfile" "$sample.tar.gz"
fi
done
} < names.txt
入力ファイル形式を考えると、1つのsed
コマンドで十分です。
sed '1!{s/^/mv /;s/$/.tar.gz/e}' names.txt
デモ、e
なし:
sed '1!{s/^/mv /;s/$/.tar.gz/}' names.txt
出力:
Tar.gz_filenames Sample_Names
mv TDF.tar.gz Sample1.tar.gz
mv DFG.tar.gz Sample2.tar.gz
mv GHY.tar.gz Sample3.tar.gz