私の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
答え1
ファイル名にスペースがないと仮定する別の方法は次のとおりです。
$ 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/'
末尾に(行の末尾にponits)を追加します。1d
names.txt
s/$/.tar.gz/
.tar.gz
$
xargs -n2
スペース/タブで区切られた2セットの文字列を読み取っています。
メモ:
cat -e names.txt
ファイルの出力がUnix形式の行末形式ではないため、Unix形式に変換した後、上記dos2unix fileName
のコマンドを適用して名前を変更します。テスト実行のために削除してください
echo
。
答え2
names.txt
示されているように、名前にスペースがなく、ファイルの最初の行にタイトルがあると仮定すると、次のようになります。
tail -n +2 names.txt | while read old new; do
mv -i "$old" "$new"
done
2行目から始めてファイル内のすべての行を印刷するので、tail -n +2
ヘッダーをスキップします。その後、-i
GNUのオプションは、mv
既存のファイルを上書きする前に(名前が競合している場合)プロンプトを表示するように指示します。
答え3
シェルの使用:tarファイル名にスペースが含まれておらず、サンプル名にもスペースが含まれていないとします。
{
read header
while read -r tarfile sample; do
if [[ -f "$tarfile" ]]; then
echo mv "$tarfile" "$sample.tar.gz"
fi
done
} < names.txt
答え4
入力ファイル形式を考えると、sed
次の1つのコマンドで十分です。
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