shell腳本的新手,必須將類檔案從不同的子目錄復制到另一個目標目錄我的目錄結構是
Module
|-- submodule
| |--main
| |--test
| |--target
| |__classes
| |__src
|
|
|-- subdirectory
|--maintest
|--target
|__ classes
|__ src
我必須將所有檔案從目標/類目錄復制到目標目錄“POM”并期望目錄結構如下
POM
|-- submodule
| |__ target
| |__classes
|
|-- subdirectory
|_target
|__ classes
嘗試使用以下命令
for dest in POM/; do cp -r modules/*/target/classes $dest; done
但它只復制了 submodule2 目錄。
注意:我們只能使用 rsync 命令。
uj5u.com熱心網友回復:
鑒于此檔案樹:
tree /tmp/Module
/tmp/Module
├── submodule1
│ └── target
│ └── classes
│ ├── class_1
│ ├── class_2
│ ├── class_3
│ ├── class_4
│ └── class_5
└── submodule2
└── target
└── classes
├── class_1
├── class_2
├── class_3
├── class_4
└── class_5
6 directories, 10 files
只需使用cp -R [source path] [target path](即,不需要 shell 回圈,也不需要 glob):
% cp -vR /tmp/Module /tmp/POM
/tmp/Module -> /tmp/POM
/tmp/Module/submodule2 -> /tmp/POM/submodule2
/tmp/Module/submodule2/target -> /tmp/POM/submodule2/target
/tmp/Module/submodule2/target/classes -> /tmp/POM/submodule2/target/classes
/tmp/Module/submodule2/target/classes/class_4 -> /tmp/POM/submodule2/target/classes/class_4
/tmp/Module/submodule2/target/classes/class_3 -> /tmp/POM/submodule2/target/classes/class_3
/tmp/Module/submodule2/target/classes/class_2 -> /tmp/POM/submodule2/target/classes/class_2
/tmp/Module/submodule2/target/classes/class_5 -> /tmp/POM/submodule2/target/classes/class_5
/tmp/Module/submodule2/target/classes/class_1 -> /tmp/POM/submodule2/target/classes/class_1
/tmp/Module/submodule1 -> /tmp/POM/submodule1
/tmp/Module/submodule1/target -> /tmp/POM/submodule1/target
/tmp/Module/submodule1/target/classes -> /tmp/POM/submodule1/target/classes
/tmp/Module/submodule1/target/classes/class_4 -> /tmp/POM/submodule1/target/classes/class_4
/tmp/Module/submodule1/target/classes/class_3 -> /tmp/POM/submodule1/target/classes/class_3
/tmp/Module/submodule1/target/classes/class_2 -> /tmp/POM/submodule1/target/classes/class_2
/tmp/Module/submodule1/target/classes/class_5 -> /tmp/POM/submodule1/target/classes/class_5
/tmp/Module/submodule1/target/classes/class_1 -> /tmp/POM/submodule1/target/classes/class_1
結果:
% tree /tmp/POM
/tmp/POM
├── submodule1
│ └── target
│ └── classes
│ ├── class_1
│ ├── class_2
│ ├── class_3
│ ├── class_4
│ └── class_5
└── submodule2
└── target
└── classes
├── class_1
├── class_2
├── class_3
├── class_4
└── class_5
6 directories, 10 files
如果您確實想要一個 Bash 腳本來執行此操作(例如,如果您想處理其中一些檔案),您可以按照以下方式執行操作:
#!/bin/bash
cd /tmp || exit
fc=0; dc=0
for fn in /tmp/Module/**/*; do
if [ -d "$fn" ]; then
# react to directories here
printf "directory %s ->t %s\n" "$fn" "${fn/Module/POM}"
mkdir -p "${fn/Module/POM}"
(( dc ))
else
# everything else returned by **/* here
printf "file %s -> %s\n" "$fn" "${fn/Module/POM}"
cp "$fn" "${fn/Module/POM}"
(( fc ))
fi
done
printf "\n%'d directories, %'d files" "$dc" "$fc"
印刷:
directory /tmp/Module/submodule1 ->t /tmp/POM/submodule1
directory /tmp/Module/submodule1/target ->t /tmp/POM/submodule1/target
directory /tmp/Module/submodule1/target/classes ->t /tmp/POM/submodule1/target/classes
file /tmp/Module/submodule1/target/classes/class_1 -> /tmp/POM/submodule1/target/classes/class_1
file /tmp/Module/submodule1/target/classes/class_2 -> /tmp/POM/submodule1/target/classes/class_2
file /tmp/Module/submodule1/target/classes/class_3 -> /tmp/POM/submodule1/target/classes/class_3
file /tmp/Module/submodule1/target/classes/class_4 -> /tmp/POM/submodule1/target/classes/class_4
file /tmp/Module/submodule1/target/classes/class_5 -> /tmp/POM/submodule1/target/classes/class_5
directory /tmp/Module/submodule2 ->t /tmp/POM/submodule2
directory /tmp/Module/submodule2/target ->t /tmp/POM/submodule2/target
directory /tmp/Module/submodule2/target/classes ->t /tmp/POM/submodule2/target/classes
file /tmp/Module/submodule2/target/classes/class_1 -> /tmp/POM/submodule2/target/classes/class_1
file /tmp/Module/submodule2/target/classes/class_2 -> /tmp/POM/submodule2/target/classes/class_2
file /tmp/Module/submodule2/target/classes/class_3 -> /tmp/POM/submodule2/target/classes/class_3
file /tmp/Module/submodule2/target/classes/class_4 -> /tmp/POM/submodule2/target/classes/class_4
file /tmp/Module/submodule2/target/classes/class_5 -> /tmp/POM/submodule2/target/classes/class_5
6 directories, 10 files
您也可以只使用rsync. 一個基本的例子是:
$ rsync -vr /tmp/Module /tmp/POM
# -r for recursive; all targets created and all files copied.
uj5u.com熱心網友回復:
您可以使用“install -D”復制檔案并創建所有主要目標目錄。
例子:
#! /bin/bash
mockup ()
{
rm -rf Module
for s in {1,2}; do
for d in main test target/classes target/src; do
mkdir -p Module/submodule$s/$d
touch Module/submodule$s/$d/f{1..3}
done
done
}
mockup
find Module \
-wholename '*/classes/*' \
-exec bash -c 'install -D "$1" "${1/#Module/POM}"' _ {} \;
選項-wholename用于find查找任何名為classes.
Bash 的引數擴展用于將“Module”替換為“POM”。
但是引數擴展需要一個變數。該模式bash -c '...' _ {}用于分配{}給$1。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/411861.html
標籤:
上一篇:.Z檔案型別的應用程式型別
