diff options
-rw-r--r-- | .github/workflows/CICD.yml | 1 | ||||
-rw-r--r-- | CHANGELOG.md | 32 | ||||
-rw-r--r-- | Cargo.lock | 155 | ||||
-rw-r--r-- | Cargo.toml | 6 | ||||
-rw-r--r-- | Cross.toml | 6 | ||||
-rw-r--r-- | README.md | 34 | ||||
-rw-r--r-- | contrib/completion/_fd | 2 | ||||
-rw-r--r-- | doc/fd.1 | 108 | ||||
-rwxr-xr-x | scripts/version-bump.sh | 22 | ||||
-rw-r--r-- | src/cli.rs | 55 | ||||
-rw-r--r-- | src/config.rs | 4 | ||||
-rw-r--r-- | src/exec/mod.rs | 159 | ||||
-rw-r--r-- | src/exec/token.rs | 98 | ||||
-rw-r--r-- | src/fmt/input.rs (renamed from src/exec/input.rs) | 0 | ||||
-rw-r--r-- | src/fmt/mod.rs | 281 | ||||
-rw-r--r-- | src/main.rs | 8 | ||||
-rw-r--r-- | src/output.rs | 22 | ||||
-rw-r--r-- | src/walk.rs | 4 | ||||
-rw-r--r-- | tests/tests.rs | 82 |
19 files changed, 696 insertions, 383 deletions
diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index c07c41c..2315319 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -88,6 +88,7 @@ jobs: - { target: i686-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true } - { target: i686-unknown-linux-musl , os: ubuntu-20.04, use-cross: true } - { target: x86_64-apple-darwin , os: macos-12 } + - { target: aarch64-apple-darwin , os: macos-14 } - { target: x86_64-pc-windows-gnu , os: windows-2019 } - { target: x86_64-pc-windows-msvc , os: windows-2019 } - { target: x86_64-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true } diff --git a/CHANGELOG.md b/CHANGELOG.md index 1717b85..34136f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,21 +1,41 @@ -# Upcoming release +# 10.1.0 ## Features -- Add `dir` as an alias to `directory` when using `-t` \ `--type`, see #1460 and #1464 (@Ato2207). -- Add support for @%s date format in time filters similar to GNU date (seconds since Unix epoch for --older/--newer), see #1493 (@nabellows) +- Allow passing an optional argument to `--strip-cwd-prefix` of "always", "never", or "auto". to force whether the cwd prefix is stripped or not. +- Add a `--format` option which allows using a format template for direct ouput similar to the template used for `--exec`. (#1043) ## Bugfixes +- Fix aarch64 page size again. This time it should actually work. (#1085, #1549) (@tavianator) -- Respect NO_COLOR environment variable with `--list-details` option. (#1455) +## Other -## Changes +- aarch64-apple-darwin target added to builds on the release page. Note that this is a tier 2 rust target. +# v10.0.0 -## Other +## Features +- Add `dir` as an alias to `directory` when using `-t` \ `--type`, see #1460 and #1464 (@Ato2207). +- Add support for @%s date format in time filters similar to GNU date (seconds since Unix epoch for --older/--newer), see #1493 (@nabellows) +- Breaking: No longer automatically ignore `.git` when using `--hidden` with vcs ignore enabled. This reverts the change in v9.0.0. While this feature + was often useful, it also broke some existing workflows, and there wasn't a good way to opt out of it. And there isn't really a good way for us to add + a way to opt out of it. And you can easily get similar behavior by adding `.git/` to your global fdignore file. + See #1457. + +## Bugfixes +- Respect NO_COLOR environment variable with `--list-details` option. (#1455) +- Fix bug that would cause hidden files to be included despite gitignore rules + if search path is "." (#1461, BurntSushi/ripgrep#2711). +- aarch64 builds now use 64k page sizes with jemalloc. This fixes issues on some systems, such as ARM Macs that + have a larger system page size than the system that the binary was built on. (#1547) +- Address [CVE-2024-24576](https://blog.rust-lang.org/2024/04/09/cve-2024-24576.html), by increasing minimum rust version. + + +## Changes +- Minimum supported rust version is now 1.77.2 # v9.0.0 @@ -28,47 +28,48 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -93,9 +94,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "bitflags" @@ -127,9 +128,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "cc" -version = "1.0.92" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2678b2e3449475e95b0aa6f9b506a28e61b3dc8996592b983695e8ebb58a8b41" +checksum = "065a29261d53ba54260972629f9ca6bffa69bac13cd1fed61420f7fa68b9f8bd" [[package]] name = "cfg-if" @@ -145,14 +146,14 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "chrono" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -207,9 +208,9 @@ checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "core-foundation-sys" @@ -301,13 +302,13 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fd-find" -version = "9.0.0" +version = "10.1.0" dependencies = [ "aho-corasick", "anyhow", @@ -327,7 +328,7 @@ dependencies = [ "jemallocator", "libc", "lscolors", - "nix 0.27.1", + "nix 0.28.0", "normpath", "nu-ansi-term", "regex", @@ -423,6 +424,12 @@ dependencies = [ ] [[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + +[[package]] name = "jemalloc-sys" version = "0.5.4+5.3.0-patched" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -459,9 +466,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.154" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" [[package]] name = "linux-raw-sys" @@ -503,17 +510,6 @@ dependencies = [ [[package]] name = "nix" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" -dependencies = [ - "bitflags 2.5.0", - "cfg-if", - "libc", -] - -[[package]] -name = "nix" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" @@ -544,9 +540,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -559,9 +555,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] @@ -615,9 +611,9 @@ checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "rustix" -version = "0.38.32" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ "bitflags 2.5.0", "errno", @@ -637,18 +633,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.197" +version = "1.0.200" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "ddc6f9cc94d67c0e21aaf7eda3a010fd3af78ebf6e096aa6e2e13c79749cce4f" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.200" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "856f046b9400cee3c8c94ed572ecdb752444c24528c035cd35882aad6f492bcb" dependencies = [ "proc-macro2", "quote", @@ -663,9 +659,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.58" +version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", @@ -827,11 +823,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -846,7 +842,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -864,7 +860,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.4", + "windows-targets 0.52.5", ] [[package]] @@ -884,17 +880,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.52.4", - "windows_aarch64_msvc 0.52.4", - "windows_i686_gnu 0.52.4", - "windows_i686_msvc 0.52.4", - "windows_x86_64_gnu 0.52.4", - "windows_x86_64_gnullvm 0.52.4", - "windows_x86_64_msvc 0.52.4", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -905,9 +902,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" @@ -917,9 +914,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" @@ -929,9 +926,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" @@ -941,9 +944,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" @@ -953,9 +956,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" @@ -965,9 +968,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" @@ -977,6 +980,6 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" @@ -16,7 +16,7 @@ license = "MIT OR Apache-2.0" name = "fd-find" readme = "README.md" repository = "https://github.com/sharkdp/fd" -version = "9.0.0" +version = "10.1.0" edition= "2021" rust-version = "1.77.2" @@ -55,7 +55,7 @@ version = "4.4.13" features = ["suggestions", "color", "wrap_help", "cargo", "derive"] [dependencies.chrono] -version = "0.4.34" +version = "0.4.38" default-features = false features = ["std", "clock"] @@ -65,7 +65,7 @@ default-features = false features = ["nu-ansi-term"] [target.'cfg(unix)'.dependencies] -nix = { version = "0.27.1", default-features = false, features = ["signal", "user"] } +nix = { version = "0.28.0", default-features = false, features = ["signal", "user"] } [target.'cfg(all(unix, not(target_os = "redox")))'.dependencies] libc = "0.2" diff --git a/Cross.toml b/Cross.toml new file mode 100644 index 0000000..3a14621 --- /dev/null +++ b/Cross.toml @@ -0,0 +1,6 @@ +# https://github.com/sharkdp/fd/issues/1085 +[target.aarch64-unknown-linux-gnu.env] +passthrough = ["JEMALLOC_SYS_WITH_LG_PAGE=16"] + +[target.aarch64-unknown-linux-musl.env] +passthrough = ["JEMALLOC_SYS_WITH_LG_PAGE=16"] @@ -282,6 +282,9 @@ If you want `fd` to ignore these patterns globally, you can put them in `fd`'s g This is usually located in `~/.config/fd/ignore` in macOS or Linux, and `%APPDATA%\fd\ignore` in Windows. +You may wish to include `.git/` in your `fd/ignore` file so that `.git` directories, and their contents +are not included in output if you use the `--hidden` option. + ### Deleting files You can use `fd` to remove all files and directories that are matched by your search pattern. @@ -330,13 +333,14 @@ Options: -d, --max-depth <depth> Set maximum search depth (default: none) -E, --exclude <pattern> Exclude entries that match the given glob pattern -t, --type <filetype> Filter by type: file (f), directory (d/dir), symlink (l), - executable (x), empty (e), socket (s), pipe (p), - block-device (b), char-device (c) + executable (x), empty (e), socket (s), pipe (p), char-device + (c), block-device (b) -e, --extension <ext> Filter by file extension -S, --size <size> Limit results based on the size of files --changed-within <date|dur> Filter by file modification time (newer than) --changed-before <date|dur> Filter by file modification time (older than) -o, --owner <user:group> Filter by owning user and/or group + --format <fmt> Print results according to template -x, --exec <cmd>... Execute a command for each search result -X, --exec-batch <cmd>... Execute a command with all search results at once -c, --color <when> When to use colors [default: auto] [possible values: auto, @@ -533,7 +537,7 @@ newlines). In the same way, the `-0` option of `xargs` tells it to read the inpu If you run Ubuntu 19.04 (Disco Dingo) or newer, you can install the [officially maintained package](https://packages.ubuntu.com/fd-find): ``` -sudo apt install fd-find +apt install fd-find ``` Note that the binary is called `fdfind` as the binary name `fd` is already used by another package. It is recommended that after installation, you add a link to `fd` by executing command @@ -543,7 +547,7 @@ Make sure that `$HOME/.local/bin` is in your `$PATH`. If you use an older version of Ubuntu, you can download the latest `.deb` package from the [release page](https://github.com/sharkdp/fd/releases) and install it via: ``` bash -sudo dpkg -i fd_9.0.0_amd64.deb # adapt version number and architecture +dpkg -i fd_9.0.0_amd64.deb # adapt version number and architecture ``` ### On Debian @@ -551,7 +555,7 @@ sudo dpkg -i fd_9.0.0_amd64.deb # adapt version number and architecture If you run Debian Buster or newer, you can install the [officially maintained Debian package](https://tracker.debian.org/pkg/rust-fd-find): ``` -sudo apt-get install fd-find +apt-get install fd-find ``` Note that the binary is called `fdfind` as the binary name `fd` is already used by another package. It is recommended that after installation, you add a link to `fd` by executing command @@ -579,6 +583,8 @@ You can install [the fd package](https://www.archlinux.org/packages/community/x8 ``` pacman -S fd ``` +You can also install fd [from the AUR](https://aur.archlinux.org/packages/fd-git). + ### On Gentoo Linux You can use [the fd ebuild](https://packages.gentoo.org/packages/sys-apps/fd) from the official repo: @@ -600,6 +606,20 @@ You can install `fd` via xbps-install: xbps-install -S fd ``` +### On ALT Linux + +You can install [the fd package](https://packages.altlinux.org/en/sisyphus/srpms/fd/) from the official repo: +``` +apt-get install fd +``` + +### On Solus + +You can install [the fd package](https://github.com/getsolus/packages/tree/main/packages/f/fd) from the official repo: +``` +eopkg install fd +``` + ### On RedHat Enterprise Linux 8/9 (RHEL8/9), Almalinux 8/9, EuroLinux 8/9 or Rocky Linux 8/9 You can install [the `fd` package](https://copr.fedorainfracloud.org/coprs/tkbcopr/fd/) from Fedora Copr. @@ -620,7 +640,7 @@ brew install fd … or with MacPorts: ``` -sudo port install fd +port install fd ``` ### On Windows @@ -665,7 +685,7 @@ pkg install fd-find ### From npm -On linux and macOS, you can install the [fd-find](https://npm.im/fd-find) package: +On Linux and macOS, you can install the [fd-find](https://npm.im/fd-find) package: ``` npm install -g fd-find diff --git a/contrib/completion/_fd b/contrib/completion/_fd index 28826a9..dc7e94d 100644 --- a/contrib/completion/_fd +++ b/contrib/completion/_fd @@ -162,7 +162,7 @@ _fd() { $no'(*)*--search-path=[set search path (instead of positional <path> arguments)]:directory:_files -/' + strip-cwd-prefix - $no'(strip-cwd-prefix exec-cmds)--strip-cwd-prefix[Strip ./ prefix when output is redirected]' + $no'(strip-cwd-prefix exec-cmds)--strip-cwd-prefix=[When to strip ./]:when:(always never auto)' + and '--and=[additional required search path]:pattern' @@ -33,16 +33,14 @@ with the '\-\-glob' option. By default .B fd will exclude hidden files and directories, as well as any files that match gitignore rules -or ignore rules in .ignore or .fdignore files. For convenenience, '.git' is treated as if it -was always included in gitignore rules. These files can be included with options such as -'\-\-hidden' and '\-\-no\-ignore'. +or ignore rules in .ignore or .fdignore files. .SH OPTIONS .TP .B \-H, \-\-hidden Include hidden files and directories in the search results (default: hidden files and directories are skipped). The flag can be overridden with '--no-hidden'. .IP -Ignored files and .git/ are still excluded unless \-\-no\-ignore or \-\-no\-ignore\-vcs +Ignored files are still excluded unless \-\-no\-ignore or \-\-no\-ignore\-vcs is also used. .TP .B \-I, \-\-no\-ignore @@ -79,7 +77,6 @@ and the global gitignore configuration .RI ( core.excludesFile git setting, which defaults to .IR $HOME/.config/git/ignore ). -The pattern ".git/" is automatically added to the list of VCS ignore rules. The flag can be overridden with '--ignore-vcs'. .TP .B \-\-no\-require\-git @@ -159,9 +156,20 @@ can be used as an alias. Enable the display of filesystem errors for situations such as insufficient permissions or dead symlinks. .TP -.B \-\-strip-cwd-prefix -By default, relative paths are prefixed with './' when the output goes to a non interactive terminal -(TTY). Use this flag to disable this behaviour. +.B \-\-strip-cwd-prefix [when] +By default, relative paths are prefixed with './' when -x/--exec, +-X/--exec-batch, or -0/--print0 are given, to reduce the risk of a +path starting with '-' being treated as a command line option. Use +this flag to change this behavior. If this flag is used without a value, +it is equivalent to passing "always". Possible values are: +.RS +.IP never +Never strip the ./ at the beginning of paths +.IP always +Always strip the ./ at the beginning of paths +.IP auto +Only strip if used with --exec, --exec-batch, or --print0. That is, it resets to the default behavior. +.RE .TP .B \-\-one\-file\-system, \-\-mount, \-\-xdev By default, fd will traverse the file system tree as far as other options dictate. With this flag, fd ensures that it does not descend into a different file system than the one it started in. Comparable to the -mount or -xdev filters of find(1). @@ -367,6 +375,30 @@ Set the path separator to use when printing file paths. The default is the OS-sp Provide paths to search as an alternative to the positional \fIpath\fR argument. Changes the usage to \'fd [FLAGS/OPTIONS] \-\-search\-path PATH \-\-search\-path PATH2 [PATTERN]\' .TP +.BI "\-\-format " fmt +Specify a template string that is used for printing a line for each file found. + +The following placeholders are substituted into the string for each file before printing: +.RS +.IP {} +path (of the current search result) +.IP {/} +basename +.IP {//} +parent directory +.IP {.} +path without file extension +.IP {/.} +basename without file extension +.IP {{ +literal '{' (an escape sequence) +.IP }} +literal '}' (an escape sequence) +.P +Notice that you can use "{{" and "}}" to escape "{" and "}" respectively, which is especially +useful if you need to include the literal text of one of the above placeholders. +.RE +.TP .BI "\-x, \-\-exec " command .RS Execute @@ -387,29 +419,12 @@ If parallelism is enabled, the order commands will be executed in is non-determi --threads=1, the order is determined by the operating system and may not be what you expect. Thus, it is recommended that you don't rely on any ordering of the results. -The following placeholders are substituted before the command is executed: -.RS -.IP {} -path (of the current search result) -.IP {/} -basename -.IP {//} -parent directory -.IP {.} -path without file extension -.IP {/.} -basename without file extension -.IP {{ -literal '{' (an escape sequence) -.IP }} -literal '}' (an escape sequence) -.RE +Before executing the command, any placeholder patterns in the command are replaced with the +corresponding values for the current file. The same placeholders are used as in the "\-\-format" +option. If no placeholder is present, an implicit "{}" at the end is assumed. -Notice that you can use "{{" and "}}" to escape "{" and "}" respectively, which is especially -useful if you need to include the literal text of one of the above placeholders. - Examples: - find all *.zip files and unzip them: @@ -433,19 +448,9 @@ once, with all search results as arguments. The order of the arguments is non-deterministic and should not be relied upon. -One of the following placeholders is substituted before the command is executed: -.RS -.IP {} -path (of all search results) -.IP {/} -basename -.IP {//} -parent directory -.IP {.} -path without file extension -.IP {/.} -basename without file extension -.RE +This uses the same placeholders as "\-\-format" and "\-\-exec", but instead of expanding +once per command invocation each argument containing a placeholder is expanding for every +file in a batch and passed as separate arguments. If no placeholder is present, an implicit "{}" at the end is assumed. @@ -494,6 +499,17 @@ is set, use .IR $XDG_CONFIG_HOME/fd/ignore . Otherwise, use .IR $HOME/.config/fd/ignore . +.SH FILES +.TP +.B .fdignore +This file works similarly to a .gitignore file anywhere in the searched tree and specifies patterns +that should be excluded from the search. However, this file is specific to fd, and will be used even +if the --no-ignore-vcs option is used. +.TP +.B $XDG_CONFIG_HOME/fd/ignore +Global ignore file. Unless ignore mode is turned off (such as with --no-ignore) +ignore entries in this file will be ignored, as if it was an .fdignore file in the +current directory. .SH EXAMPLES .TP .RI "Find files and directories that match the pattern '" needle "':" @@ -507,6 +523,16 @@ $ fd -e py .TP .RI "Open all search results with vim:" $ fd pattern -X vim +.SH Tips and Tricks +.IP \[bu] +If you add ".git/" to your global ignore file ($XDG_CONFIG_HOME/fd/ignore), then +".git" folders will be ignored by default, even when the --hidden option is used. +.IP \[bu] +You can use a shell alias or a wrapper script in order to pass desired flags to fd +by default. For example if you do not like the default behavior of respecting gitignore, +you can use +`alias fd="/usr/bin/fd --no-ignore-vcs"` +in your .bashrc to create an alias for fd that doesn't ignore git files by default. .SH BUGS Bugs can be reported on GitHub: https://github.com/sharkdp/fd/issues .SH SEE ALSO diff --git a/scripts/version-bump.sh b/scripts/version-bump.sh new file mode 100755 index 0000000..dd2f5e3 --- /dev/null +++ b/scripts/version-bump.sh @@ -0,0 +1,22 @@ +#!/usr/bin/bash + +set -eu + +# This script automates the "Version bump" section + +version="$1" + +if [[ -z $version ]]; then + echo "Usage: must supply version as first argument" >&2 + exit 1 +fi + +git switch -C "release-$version" +sed -i -e "0,/^\[badges/{s/^version =.*/version = \"$version\"/}" Cargo.toml + +msrv="$(grep -F rust-version Cargo.toml | sed -e 's/^rust-version= "\(.*\)"/\1/')" + +sed -i -e "s/Note that rust version \*[0-9.]+\* or later/Note that rust version *$msrv* or later/" README.md + +sed -i -e "s/^# Upcoming release/# $version/" CHANGELOG.md + @@ -49,8 +49,7 @@ pub struct Opts { no_hidden: (), /// Show search results from files and directories that would otherwise be - /// ignored by '.gitignore', '.ignore', '.fdignore', the global ignore file, - /// or the default rule that excludes .git/. + /// ignored by '.gitignore', '.ignore', '.fdignore', or the global ignore file, /// The flag can be overridden with --ignore. #[arg( long, @@ -64,7 +63,7 @@ pub struct Opts { #[arg(long, overrides_with = "no_ignore", hide = true, action = ArgAction::SetTrue)] ignore: (), - ///Show search results from '.git/' folders and files and directories that + ///Show search results from files and directories that ///would otherwise be ignored by '.gitignore' files. ///The flag can be overridden with --ignore-vcs. #[arg( @@ -399,7 +398,7 @@ pub struct Opts { /// Filter results based on the file modification time. Files with modification times /// greater than the argument are returned. The argument can be provided - /// as a specific point in time (YYYY-MM-DD HH:MM:SS) or as a duration (10h, 1d, 35min). + /// as a specific point in time (YYYY-MM-DD HH:MM:SS or @timestamp) or as a duration (10h, 1d, 35min). /// If the time is not specified, it defaults to 00:00:00. /// '--change-newer-than', '--newer', or '--changed-after' can be used as aliases. /// @@ -421,7 +420,7 @@ pub struct Opts { /// Filter results based on the file modification time. Files with modification times /// less than the argument are returned. The argument can be provided - /// as a specific point in time (YYYY-MM-DD HH:MM:SS) or as a duration (10h, 1d, 35min). + /// as a specific point in time (YYYY-MM-DD HH:MM:SS or @timestamp) or as a duration (10h, 1d, 35min). /// '--change-older-than' or '--older' can be used as aliases. /// /// Examples: @@ -453,6 +452,20 @@ pub struct Opts { )] pub owner: Option<OwnerFilter>, + /// Instead of printing the file normally, print the format string with the following placeholders replaced: + /// '{}': path (of the current search result) + /// '{/}': basename + /// '{//}': parent directory + /// '{.}': path without file extension + /// '{/.}': basename without file extension + #[arg( + long, + value_name = "fmt", + help = "Print results according to template", + conflicts_with = "list_details" + )] + pub format: Option<String>, + #[command(flatten)] pub exec: Exec, @@ -618,9 +631,10 @@ pub struct Opts { /// By default, |