使用不帶 ./ 的查找結果

使用不帶 ./ 的查找結果

我正在嘗試使用 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/{}'

man find

  • -print0在標準輸出上列印完整的檔案名,後面跟著一個null 字元。

man cut- 從文件的每一行中刪除部分

  • -z行分隔符號是NUL,而不是換行符。
  • -c僅選擇這些字元。
  • N-從第 N 個位元組、字元或欄位(從 1 開始計數)到行尾。

man xargs- 從標準輸入建置和執行命令列。

  • xargs [options] [command [initial-arguments]]
  • -0輸入項以字元而不是空格結尾null,引號和反斜線並不特殊(每個字元均按字面意思理解)。
  • -I replace-strreplace-str將中 出現的 替換為initial-arguments從標準輸入讀取的名稱。此外,不含引號的空格不會終止輸入項;相反,分隔符號是換行符。暗示-L 1
  • -L max-linesmax-lines每個命令列 最多使用非空白輸入行。

相關內容