
我正在嘗試使用 find 創建一堆符號鏈接,但使用帶有 {} 的結果在每個文件名之前包含 ./ 。我怎樣才能避免這種情況?
find . -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;
答案1
您只需更改命令中的一個字元:
find * -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;
# ^
答案2
使用標準語法,例如:
S=/sourcedir D=/destdir find . -type l -name '*.h' -exec sh -c '
for i do
ln -s -- "$S${i#.}" "$D/$i"
done' sh {} +
如果你想使用 GNUisms,你可以這樣做:
find . -type l -name '*.h' -printf '/sourcedir/%P\0/destdir/%P\0' |
xargs -r0n2 ln -s
或者如果/sourcedir
是目前目錄:
find "$PWD" -type l -name '*.h' -printf '%p\0/destdir/%P\0' |
xargs -r0n2 ln -s
答案3
find
將列印相對於您作為參數提供的路徑的名稱。在本例中,路徑為.
,因此所有名稱都以 開頭./
。要取得絕對路徑,您需要提供絕對路徑作為輸入:
find "$PWD" -type l -name '*.h'
該命令使用$PWD
環境變量,其中包含當前工作目錄的絕對路徑,因此它應該保留原始命令的含義。
答案4
find . -type l -name '*.h' -print0 | cut -z -c3- \
| xargs -0 -I '{}' ln -s '/sourcedir/{}' '/destinationdir/{}'
-print0
在標準輸出上列印完整的檔案名,後面跟著一個null
字元。
man cut
- 從文件的每一行中刪除部分
-z
行分隔符號是NUL
,而不是換行符。-c
僅選擇這些字元。N-
從第 N 個位元組、字元或欄位(從 1 開始計數)到行尾。
man xargs
- 從標準輸入建置和執行命令列。
xargs [options] [command [initial-arguments]]
-0
輸入項以字元而不是空格結尾null
,引號和反斜線並不特殊(每個字元均按字面意思理解)。-I replace-str
replace-str
將中 出現的 替換為initial-arguments
從標準輸入讀取的名稱。此外,不含引號的空格不會終止輸入項;相反,分隔符號是換行符。暗示-L 1
。-L max-lines
max-lines
每個命令列 最多使用非空白輸入行。