
したがって、すべてのファイルを指定されたディレクトリにコピーするbashスクリプトを作成する必要がありますが、文字/
を__
。
zad1.sh
たとえば、ファイルがディレクトリにある場合は、ファイル名を次のように変更する必要があります。/home/123456/
__home__123456__zad1.sh
これを行う方法についてのアイデアはありますか?
答え1
ファイルパスを取得するには:
realpath <file>
Bashで交換:
echo "${var//search/replace}"
最初の 2 つのスラッシュは、グローバル検索を実行するために使用されます。 justを使用すると、/
一度だけ置き換えることができます。
したがって、あなたのコードは
path=$(realpath zad1.sh)
path_replaced=${path//\//__}
答え2
私はこれがあなたが要求することを達成すると信じています:
#!/bin/bash
_from_dir=/path/to/files
_to_dir=/path/to/dest
for file in "${_from_dir}/"*; do
nfile="$(sed 's#/#__#g' <<<"$file")"
cp "$file" "${_to_dir}/$nfile"
done
_from_dir
変数はファイルのあるパスに設定し、_to_dir
変数はファイルをコピーするパスに設定します。
_from_dir
ループはその場所の各ファイルを繰り返します。nfile
ファイルのフルパスをインポートして/
に置き換えます__
。次に、ソースへのフルパスを表す名前のパスcp
にファイルを配置します。_to_dir
答え3
古典的な方法はsedを使用することです。
cp "${filename}" "$(realpath ${filename} | sed s:/:__:g)"
bashを常に使用していない場合、利点は主にシェル間の移植性です。
もちろん、スクリプトをあきらめて find を使うこともできます:
find /base/path -type f -exec cp \{\} `realpath \{\} | sed s:/:__:g` \;
検索には、特定のファイルのみをコピーする必要がある場合に使用できる並べ替えとフィルタリングオプションがあります。
編集:このルックアップ設定は私のシステムの1つでは機能しますが、他のシステムでは機能しません。違いを解決する代わりに、より移植性を高めました。
find /base/path -type f | sed -e "p; s:/:__:g" | xargs -n2 cp
答え4
私は次の方法でそれをしました
ls -ltr /root/l.txt| awk '{print "cp" " " $NF,$NF}'| awk '{gsub("/","_",$NF);print $1,$2,"/root/p1/"$3}'| sh
ここで、/root/l.txt ファイルは /root/p1/ パスにコピーされますが、ファイル名は _root_l.txt になります。混乱する箇所があれば教えてください。
Here /root/p1==> destination path