天天看點

Linux 腳本:從檔案中讀取檔案路徑并以相同目錄結構複制到目前目錄

作者:skyyx2002

前言

顯然這個腳本的作用,是将指定的檔案提取到目前目錄中,并保持它原本的目錄結構

比如,我想把系統中lftp的所有檔案按原本的目錄結構複制出來。。

你可能會疑問,為什麼不直接從deb包中提取,比如這樣:

apt download lftp #從倉庫中下載下傳lftp的deb包,假設這裡下載下傳好的檔案名是lftp.deb
dpkg -X lftp.deb lftp #将lftp.deb檔案解壓           

這确實是個好方法!

可如果隻有檔案清單,deb包下不到呢?

又或者,系統中的某些檔案是被修改過的,和倉庫下載下傳解包的不同呢?

當然,可能還有其它情況。。

做這個腳本,正是因為我在研究某個軟體時,有它的檔案清單卻下不到它的包。。

這裡以lftp的檔案清單做示範。

建立兩個檔案,如圖:

Linux 腳本:從檔案中讀取檔案路徑并以相同目錄結構複制到目前目錄

檔案清單.txt 中的内容如下:

/usr/share/doc/lftp/README.debug-levels
/usr/share/doc/lftp/README.gz
/usr/share/doc/lftp/README.modules
/usr/share/doc/lftp/changelog.Debian.gz
/usr/share/doc/lftp/changelog.gz
/usr/share/icons/hicolor/48x48/apps/lftp-icon.png
/usr/share/man/man1/lftp.1.gz
/etc/lftp.conf
/usr/share/man/man5/lftp.conf.5.gz
/usr/share/applications/lftp.desktop
/usr/share/locale/zh_CN/LC_MESSAGES/lftp.mo
/usr/share/locale/es/LC_MESSAGES/lftp.mo
/usr/share/locale/zh_HK/LC_MESSAGES/lftp.mo
/usr/share/locale/zh_TW/LC_MESSAGES/lftp.mo
/usr/share/locale/it/LC_MESSAGES/lftp.mo
/usr/share/locale/cs/LC_MESSAGES/lftp.mo
/usr/share/locale/ja/LC_MESSAGES/lftp.mo
/usr/share/locale/ru/LC_MESSAGES/lftp.mo
/usr/share/locale/de/LC_MESSAGES/lftp.mo
/usr/share/locale/pt_BR/LC_MESSAGES/lftp.mo
/usr/share/locale/fr/LC_MESSAGES/lftp.mo
/usr/share/locale/ko/LC_MESSAGES/lftp.mo
/usr/share/locale/pl/LC_MESSAGES/lftp.mo
/usr/share/locale/uk/LC_MESSAGES/lftp.mo
/usr/share/man/man1/lftpget.1.gz           

提取檔案.sh 的腳本内容:

#!/bin/bash
file="檔案清單.txt"

if [ ! -e $file ];then
  echo $file '不存在,腳本無法繼續!'
  exit
fi

echo '請輸入登陸密碼:'
read passwd
echo $passwd |sudo -S echo
if [ $? != 0 ];then
  echo "執行失敗,可能是密碼錯誤!"
  exit
fi

#從清單檔案中提取所有路徑,并在目前檔案夾下建立
cat $file |awk -F/ '{
for ( i=1;i<NF;i++ ){ #NF表示字段數
  if (i == 1){
    sky = "." $i; #第一次循環加上 . 
  }else{
    sky = sky "/" $i;
  }

 }
 print sky; #輸出路徑
 sky=""; #初始化路徑,準備下一次循環

}'|xargs mkdir -p 

#将清單中的檔案,拷貝到目前檔案夾下的對應目錄中
cat $file |awk '{
  system("sudo cp "$1" ."$1" ")
}'
           

因為是自用的腳本,裡面的變量命名很随意,比如sky。。懶得改了,請自行修改。。

執行腳本

在檔案夾空白處點選右鍵,選擇“在終端中打開”:

Linux 腳本:從檔案中讀取檔案路徑并以相同目錄結構複制到目前目錄

在彈出的終端視窗中輸入:

bash 提取檔案.sh           
Linux 腳本:從檔案中讀取檔案路徑并以相同目錄結構複制到目前目錄

回車後,輸入目前系統登陸的使用者密碼,正确的話所有的檔案就拷貝過來了:

Linux 腳本:從檔案中讀取檔案路徑并以相同目錄結構複制到目前目錄